在python中调用上下文管理器

时间:2014-10-13 14:34:36

标签: python function yield contextmanager

我试图找到一个好方法来解释为什么通过调用另一个按预期工作来创建一个专门的上下文管理器。我不是在抱怨!它确实很棒。但我不确定它是否会起作用,直到我测试它,因此我觉得我失去了一些东西。

只是为了澄清以下例子:

>>> 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 f的收益率会上升到f42?为什么我不需要明确地将f42写为上下文管理器。

2 个答案:

答案 0 :(得分:1)

在你的last语句中,f42()被计算并运行f(42),然后在你的with语句的上下文中使用。

答案 1 :(得分:1)

f(42)语句中使用with并在另一个函数中使用它然后返回它之间没有区别with要求的是表达式生成上下文管理器。

你也可以这样做:

cm = f(42)
with cm:
    print(3)

Python所做的就是在with <expression>语句中执行表达式,然后将该表达式的结果视为上下文管理器。表达式如何产生上下文管理器并不重要。

换句话说,f不是您的上下文管理器,只是f()调用的返回值