gpt4 book ai didi

python - 不推荐使用 contextlib.nested 的第二种情况的说明(Python 文档)

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:59 24 4
gpt4 key购买 nike

context.nested 已被弃用,我试图理解这背后的基本原理,在阅读了很长时间的文档后,我看不到一个例子来说明第二个问题:

Secondly, if the __enter__() method of one of the inner context managers raises an exception that is caught and suppressed by the __exit__() method of one of the outer context managers, this construct will raise RuntimeError rather than skipping the body of the with statement.

首先这里的inner context managers和outer context managers是什么意思?这在代码中会是什么样子?

编辑:

根据我的理解,我尝试用代码来证明这个问题:

>>> 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

FWIW,contextlib.nested 的替代品是 ExitStack在 python 3.4+ 中。有一个 backport对于 python2。

关于python - 不推荐使用 contextlib.nested 的第二种情况的说明(Python 文档),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39439594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com