【问题标题】:Calling context managers in python在 python 中调用上下文管理器
【发布时间】:2014-10-13 14:34:35
【问题描述】:

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

只是为了澄清考虑以下示例:

>>> 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 写为上下文管理器。

【问题讨论】:

    标签: python function yield contextmanager


    【解决方案1】:

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

    你也可以这样做:

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

    Python 所做的只是执行with <expression> 语句中的表达式,然后将该表达式的结果 视为上下文管理器。表达式如何生成上下文管理器无关紧要。

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

    【讨论】:

      【解决方案2】:

      在您的最后一个 with 语句中,f42() 被评估并运行 f(42),然后在您的 with 语句的上下文中使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-21
        相关资源
        最近更新 更多