在python中调用上下文管理器

赫南

我试图找到一种很好的方法来解释为什么通过调用另一个人来创建一个专门的上下文管理器的工作按预期进行。我不是在抱怨!它的确很棒。但是我不确定是否可以使用,直到我对其进行了测试,因此我感到自己正在失去一些东西。

为了澄清考虑以下示例:

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

马丁·彼得斯(Martijn Pieters)

没有什么区别使用之间f(42)with语句,并在另一个函数中使用它,然后返回它。所有这一切with需要的是,表达会产生一个文件管理器。

您也可以这样做:

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在python中调用上下文管理器的多种方法

使用上下文管理器作为功能

如何使用上下文管理器锁定

是否使用上下文管理器?

Python 上下文管理器

Python中的琐碎上下文管理器

停止python进程,以便上下文管理器仍调用__exit __(在Windows中)

在 python 中使用上下文管理器超时进程

Python:使用上下文管理器临时更改随机种子的危险?

垃圾回收期间无法调用 on_state_changed,请务必关闭或使用上下文管理器

使用上下文管理器管理多种资源的正确方法

如何在不使用上下文管理器的情况下避免在 Locust 中记录请求?

如何使用上下文管理器以原子方式(退出时)在列表中附加值?

如何使用上下文管理器将每个方法包装在一个类中?

在python中,在安装/拆卸中使用上下文管理器有一个很好的习惯用法

在python中,在设置/拆卸中使用上下文管理器有一个很好的习惯用法

Python类型提示和上下文管理器

测量时间的Python上下文管理器

Python:模拟上下文管理器

Python:模拟上下文管理器

Python多行嵌套上下文管理器

Python:标准函数和上下文管理器?

Python 3 urlopen上下文管理器模拟

python上下文管理器不传递异常

如何使 python 类成为上下文管理器

在上下文管理器中处理异常

异步上下文管理器

在Python中充当装饰器和上下文管理器的函数吗?

python中的上下文管理器和帮助器功能