我试图找到一种很好的方法来解释为什么通过调用另一个人来创建一个专门的上下文管理器的工作按预期进行。我不是在抱怨!它的确很棒。但是我不确定是否可以使用,直到我对其进行了测试,因此我感到自己正在失去一些东西。
为了澄清考虑以下示例:
>>> from contextlib import contextmanager
>>> @contextmanager
... def f(val):
... print(val)
... yield
... print(val+1)
...
>>>
>>> with f(1):
... print(3)
...
1
3
2
现在我们专门化它:
>>> def f42():
... return f(42)
...
>>> with f42():
... print(3)
...
42
3
43
我想让我感到困惑的是,为什么从f到f42的收益率上升?为什么我不需要显式地将f42编写为上下文管理器。
有没有什么区别使用之间f(42)
的with
语句,并在另一个函数中使用它,然后返回它。所有这一切with
需要的是,表达会产生一个文件管理器。
您也可以这样做:
cm = f(42)
with cm:
print(3)
Python所做的全部工作就是执行with <expression>
语句中的表达式,然后将该表达式的结果视为上下文管理器。表达式如何产生上下文管理器无关紧要。
换句话说,f
这里不是您的上下文管理器,仅是对的调用的返回值f()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句