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