from contextlib import contextmanager, nested
...
@documented_contextmanager
def _setenv(variables):
if callable(variables):
variables = variables()
clean_revert = variables.pop('clean_revert', False)
previous = {}
new = []
for key, value in variables.iteritems():
if key in state.env:
previous[key] = state.env[key]
else:
new.append(key)
state.env[key] = value
try:
yield
finally:
if clean_revert:
for key, value in variables.iteritems():
if key in state.env and value == state.env[key]:
if key in previous:
state.env[key] = previous[key]
else:
del state.env[key]
else:
state.env.update(previous)
for key in new:
del state.env[key]
def settings(*args, **kwargs):
managers = list(args)
if kwargs:
managers.append(_setenv(kwargs))
return nested(*managers)
https://github.com/fabric/fabric/blob/master/fabric/context_managers.py
由于Python 3中没有
nested
-在转换它时需要一些帮助。2to3
只会打印很多Generating grammar tables from ...
,但没什么用。此代码在Python 3中的外观如何?
最佳答案
您可以使用contextlib.ExitStack
模拟return nested(*managers)
:
from contextlib import ExitStack, contextmanager
@contextmanager
def settings(*args, **kwargs):
# ... populate `managers`
with ExitStack() as stack:
yield tuple(stack.enter_context(cm) for cm in managers)
关于python - 使用“contextlib.nested”的此Python代码在Python 3中应如何显示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20916127/