Python 中 with 语句与 contextlib 进阶用法
contextlib 模块中除了 @contextmanager 还有哪些有用的工具?请举例说明。
回答
专业代码师
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
contextlib.suppress(*exceptions):抑制指定异常
from contextlib import suppress
import os
with suppress(FileNotFoundError):
os.remove('temp.txt') # 文件不存在不报错
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'
contextlib.ExitStack:动态管理上下文
from contextlib import ExitStack
with ExitStack() as stack:
files = [stack.enter_context(open(f)) for f in ['a.txt', 'b.txt']]
# 自动清理所有打开的文件
@contextlib.asynccontextmanager:异步上下文管理器(Python 3.7+)