有没有人在python的__enter__
和__exit__
用例的文件对象实现之外有一个真实世界的例子?最好是你自己的,因为我想要实现的是一个更好的方法来概念化它将被使用的情况。
我已阅读this。
答案 0 :(得分:7)
有许多用途。就在我们的标准库中:
sqlite3
;使用connection as a context manager转换提交或中止交易。
unittest
;使用assertRaises
作为上下文管理器可以引发异常,然后测试异常的各个方面。
decimal
; localcontext
管理十进制数精度,舍入和其他方面。
threading
对象(如锁,信号量和条件)为context managers too;让你获得一组语句的锁等等。
warnings
模块为您提供context manager to temporarily catch warnings。
Python自己的test.test_support
module使用多个上下文管理器,检查特定警告,捕获stdout
,忽略特定异常并临时设置环境变量。
每当您想要检测代码块何时开始和/或结束时,您都希望使用上下文管理器。在您使用try:
和finally:
套件来保证清理之前,请使用上下文管理器。
答案 1 :(得分:3)
Python Wiki上有几个例子。
规范的答案是锁定:
with (acquire some mutex):
# do stuff with mutex
Here's a Stack Overflow question and answer involving locks and the with
statement.
答案 2 :(得分:2)
我发现拥有contextmanager
版本的os.chdir()
非常有用:退出时chdir()
返回原始目录。
这允许您模拟一个通用(Bourne)shell脚本模式:
(
cd <some dir>
<do stuff>
)
即。您在子shell(<some dir>
(
)内更改为新的目录)
,以便确保返回原始目录,即使<do stuff>
导致错误
比较Python中的上下文管理器和vanilla版本。香草:
original_dir = os.getcwd()
os.chdir(<some dir>)
try:
<do stuff>
finally:
os.chdir(original_dir)
使用上下文管理器:
with os.chdir(<some dir>):
<do stuff>
后者更好!