context.nested
被弃用,我试图理解这背后的基本原理,在阅读了很长一段时间的文档后,我看不到一个例子来明确第二个问题:
其次,如果某个内部上下文管理器的
__enter__()
方法引发异常,而该异常被某个外部上下文管理器的__exit__()
方法捕获并抑制,则该构造将引发RuntimeError
而不是跳过with
语句的主体。
首先,这里的内部上下文管理器和外部上下文管理器的含义是什么?这在代码中会是什么样子呢?
编辑:根据我的理解,我试着用代码来演示这个问题:
>>> class A:
... def __enter__(*args):
... print("enter A")
... def __exit__(*args): print("exit A"); return True
...
>>> class B:
... def __enter__(*args): print("B __enter__")
... def __exit__(*args): raise Exception("spam")
...
>>> with nested(A(), B()): pass # A() outer context, B() inner context?
...
enter A
B __enter__
exit A
但是这段代码不会引发RuntimeError
?
在您的示例中,您有上下文管理器B
在__exit__
方法中引发异常。但是引号描述的是由__enter__
方法引发的内部异常。我能够通过将引发的异常移动到__enter__
方法来重现RuntimeError
。
fww, contextlib.nested
的替代品是python 3.4+中的ExitStack
。python2有一个backport