@contextmanager deftemporary_setting(settings, **kwargs): original_values = {key: getattr(settings, key) for key in kwargs} for key, value in kwargs.items(): setattr(settings, key, value) try: yield finally: for key, value in original_values.items(): setattr(settings, key, value)
@contextmanager defenv_vars(**kwargs): original = {} for key, value in kwargs.items(): if key in os.environ: original[key] = os.environ[key] os.environ[key] = value try: yield finally: for key in kwargs: if key in original: os.environ[key] = original[key] else: del os.environ[key]
# 使用示例 with env_vars(DEBUG='1', LOG_LEVEL='DEBUG'): # 使用修改后的环境变量 print(os.environ.get('DEBUG'))
嵌套上下文管理器
上下文管理器可以嵌套使用,这在需要同时管理多个资源时非常有用:
1 2 3
withopen('input.txt', 'r') as infile, open('output.txt', 'w') as outfile: for line in infile: outfile.write(line.upper())
异常处理
上下文管理器的__exit__方法可以处理在with块中发生的异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSuppressErrors: def__init__(self, *exception_types): self.exception_types = exception_types or (Exception,) def__enter__(self): returnself def__exit__(self, exc_type, exc_val, exc_tb): if exc_type isnotNoneandissubclass(exc_type, self.exception_types): print(f"捕获异常: {exc_val}") returnTrue# 返回True表示异常已处理 returnFalse# 返回False表示异常未处理,会继续传播 # 使用示例 with SuppressErrors(ValueError, ZeroDivisionError): result = 1 / 0# 这个异常会被捕获并抑制 print("这行不会执行") print("继续执行")