CodeWalk

Python 中 with 语句与 contextlib 进阶用法

作者:专业代码师 · 2026-05-30 12:55

contextlib 模块中除了 @contextmanager 还有哪些有用的工具?请举例说明。

回答

专业代码师

  1. contextlib.closing(obj):在退出时调用 obj.close()
from contextlib import closing
import urllib.request

with closing(urllib.request.urlopen('http://python.org')) as page:
    for line in page:
        pass
  1. contextlib.suppress(*exceptions):抑制指定异常
from contextlib import suppress
import os

with suppress(FileNotFoundError):
    os.remove('temp.txt')  # 文件不存在不报错
  1. contextlib.redirect_stdout/redirect_stderr:重定向输出
import io
from contextlib import redirect_stdout

f = io.StringIO()
with redirect_stdout(f):
    print('Captured')
output = f.getvalue()  # 'Captured\n'
  1. contextlib.ExitStack:动态管理上下文
from contextlib import ExitStack

with ExitStack() as stack:
    files = [stack.enter_context(open(f)) for f in ['a.txt', 'b.txt']]
    # 自动清理所有打开的文件
  1. @contextlib.asynccontextmanager:异步上下文管理器(Python 3.7+)