使用with语句,我们可以仅使用一种缩进/嵌套级别来输入许多上下文处理程序:

>>> from contextlib import contextmanager
>>> @contextmanager
... def frobnicate(n):
...     print('frobbing {}'.format(n))
...     yield
...
>>> frob1 = frobnicate(1)
>>> frob2 = frobnicate(2)
>>> with frob1, frob2:
...     pass
...
frobbing 1
frobbing 2

但这似乎不起作用:
>>> frobs = [frobnicate(1), frobnicate(2)]
>>> with *frobs:
...     pass
# SyntaxError: invalid syntax

我们如何输入n个上下文管理器而不必手动写出每个上下文管理器?

最佳答案

python2.7确实具有contextlib.nested来做到这一点,但是由于容易出错的怪癖,它已被弃用。

python3.3使用contextlib.ExitStack可以做得更好:

from contextlib import ExitStack

with ExitStack() as stack:
    contexts = [stack.enter_context(frobnicate(i)) for i in range(2)]
    ...
有关向python2.x代码的反向移植,请参见contextlib2

关于python - 如何__进入__上下文管理器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26855747/

10-12 21:47