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/

10-12 22:10
查看更多