对于第二个使用contextlib的情况的解释.嵌套被弃用(Python文档)



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

最新更新