上下文管理器专项测试
考察知识点
- with语句:基本用法、资源管理、异常处理
- enter__和__exit:上下文管理器协议、返回值处理
- contextlib模块:contextmanager装饰器、closing函数
- 嵌套上下文:多个上下文管理器、退出顺序
contextlib.contextmanager 装饰器可以将一个包含 yield 的普通函数转换为上下文管理器,yield 之前的代码等价于 __enter__ 方法,yield 之后的代码等价于 __exit__ 方法。
Python支持嵌套使用with语句,可以同时管理多个资源,多个with语句可以写在同一行。
with语句用于简化资源管理,确保资源在使用后自动释放,即使发生异常也能正确清理。
__exit__方法返回True可以抑制异常,使异常不再传播;返回False则异常会继续抛出。
实现上下文管理器协议需要定义__enter__和__exit__两个方法,这是Python上下文管理器的核心协议。
以下哪种情况__exit__方法不会被调用?
with语句块内发生异常时,以下哪项正确?
__exit__(self, exc_type, exc_val, exc_tb)中的三个参数,当with块内没有异常时:
__enter__方法的返回值会赋给with语句中的哪个变量?
使用@contextmanager装饰器创建上下文管理器时,yield语句的作用是:
嵌套上下文管理器的退出顺序是:
contextlib模块的suppress装饰器/函数的作用是:
contextlib.ExitStack的主要用途是:
以下代码执行后会发生什么?
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('继续执行')
with语句的执行流程是:
with语句进入代码块前调用____________方法,退出代码块后调用____________方法。as关键字后的变量是____________方法的返回值。with语句确保资源在异常发生时也能正确释放。
__exit__方法接收三个异常参数:____________(异常类型)、____________(异常值)、____________(异常追踪)。无异常时三者都是None。返回True可抑制异常,返回False则异常继续抛出。
上下文管理器协议要求实现____________和____________两个方法。__enter__方法在进入with块时调用,其____________赋给as后的变量。__exit__方法在退出with块时调用,接收三个异常参数,返回True可以抑制异常。
多个with语句可以在同一行使用____________分隔,Python 3.10+支持用____________包裹。使用ExitStack可以动态管理____________的上下文管理器,通过enter_context方法添加新的上下文,退出时按后进先出顺序调用各__exit__。
使用@contextmanager装饰器时,____________之前的代码相当于____________方法,____________的值赋给as后的变量,yield之后在finally块中的代码相当于__exit__方法。