全部学科
Python全栈
python
NodeJS全栈
nodejs

上下文管理器专项测试

20 题 40 分钟 难度:★★

考察知识点

  • with语句:基本用法、资源管理、异常处理
  • enter__和__exit:上下文管理器协议、返回值处理
  • contextlib模块:contextmanager装饰器、closing函数
  • 嵌套上下文:多个上下文管理器、退出顺序
💡 参考答案在文末
判断题
1

contextlib.contextmanager 装饰器可以将一个包含 yield 的普通函数转换为上下文管理器,yield 之前的代码等价于 __enter__ 方法,yield 之后的代码等价于 __exit__ 方法。

A

B

2

Python支持嵌套使用with语句,可以同时管理多个资源,多个with语句可以写在同一行。

A

B

3

with语句用于简化资源管理,确保资源在使用后自动释放,即使发生异常也能正确清理。

A

B

4

__exit__方法返回True可以抑制异常,使异常不再传播;返回False则异常会继续抛出。

A

B

5

实现上下文管理器协议需要定义__enter____exit__两个方法,这是Python上下文管理器的核心协议。

A

B

单选题
6

以下哪种情况__exit__方法不会被调用?

A

with块正常执行完毕

B

with块内发生异常

C

with块内使用return语句返回

D

程序在__enter__执行前崩溃

7

with语句块内发生异常时,以下哪项正确?

A

异常被忽略,继续执行

B

__exit__方法被调用后异常被重新抛出

C

__exit__方法不会被调用

D

程序直接终止,不调用任何方法

8

__exit__(self, exc_type, exc_val, exc_tb)中的三个参数,当with块内没有异常时:

A

都是None

B

分别是异常类型、值、追踪信息

C

只有exc_type是None

D

参数为空

9

__enter__方法的返回值会赋给with语句中的哪个变量?

A

with语句中的对象实例

B

as关键字后的变量

C

__exit__方法的参数

D

不返回任何值

10

使用@contextmanager装饰器创建上下文管理器时,yield语句的作用是:

A

定义__exit__方法

B

返回值给as变量,分割__enter__和__exit__代码

C

终止上下文管理器

D

抑制异常

11

嵌套上下文管理器的退出顺序是:

A

先进入先退出(FIFO)

B

先进入后退出(LIFO)

C

随机顺序

D

按字母顺序

12

contextlib模块的suppress装饰器/函数的作用是:

A

输出异常信息

B

抑制指定的异常类型,不让异常传播

C

创建上下文管理器

D

重定向输出

13

contextlib.ExitStack的主要用途是:

A

抑制异常

B

动态管理数量不定的多个上下文管理器

C

简化单个上下文管理器的创建

D

重定向输出

14

以下代码执行后会发生什么?

Python
class Handler:
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            print(f'异常: {exc_type.__name__}')
            return exc_type == ValueError
        return False

with Handler():
    raise ValueError('test')
print('继续执行')
A

输出"异常: ValueError"和"继续执行"

B

输出"异常: ValueError",然后程序终止

C

ValueError异常被抛出

D

输出"继续执行"(无异常信息)

15

with语句的执行流程是:

A

执行代码块 → 调用__enter__ → 调用__exit__

B

调用__enter__ → 执行代码块 → 调用__exit__

C

调用__exit__ → 执行代码块 → 调用__enter__

D

执行代码块 → 调用__exit__ → 调用__enter__

填空题
16

with语句进入代码块前调用____________方法,退出代码块后调用____________方法。as关键字后的变量是____________方法的返回值。with语句确保资源在异常发生时也能正确释放。

17

__exit__方法接收三个异常参数:____________(异常类型)、____________(异常值)、____________(异常追踪)。无异常时三者都是None。返回True可抑制异常,返回False则异常继续抛出。

18

上下文管理器协议要求实现________________________两个方法。__enter__方法在进入with块时调用,其____________赋给as后的变量。__exit__方法在退出with块时调用,接收三个异常参数,返回True可以抑制异常。

19

多个with语句可以在同一行使用____________分隔,Python 3.10+支持用____________包裹。使用ExitStack可以动态管理____________的上下文管理器,通过enter_context方法添加新的上下文,退出时按后进先出顺序调用各__exit__。

20

使用@contextmanager装饰器时,____________之前的代码相当于____________方法,____________的值赋给as后的变量,yield之后在finally块中的代码相当于__exit__方法。

参考答案
1.正确 2.正确 3.正确 4.正确 5.正确 6.D 7.B 8.A 9.B 10.B 11.B 12.B 13.B 14.A 15.B 16.__enter__;__exit__;__enter__ 17.exc_type;exc_val;exc_tb 18.__enter__;__exit__;返回值 19.逗号;括号;数量不定 20.yield;__enter__;yield
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一套试卷 Python高级技能认证
下一套试卷 → 元编程专项测试
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码