有没有人在 python 的文件对象实现之外有一个真实世界的例子,__enter__
和__exit__
用例?最好是你自己的,因为我试图实现的是概念化使用它的情况的更好方法。
我已经读过了。
而且,这是指向python文档的链接。
有很多用途。仅在标准库中,我们有:
-
sqlite3
; 将连接用作上下文管理器将转换为提交或中止事务。 -
unittest
; 使用assertRaises
作为上下文管理器可以断言引发异常,然后测试异常的各个方面。 -
decimal
;localcontext
管理十进制数精度、舍入和其他方面。 -
threading
对象(如锁、信号量和条件)也是上下文管理器;允许您为一组语句等获取锁。 -
warnings
模块为您提供了一个上下文管理器来临时捕获警告。 -
许多库提供关闭行为,就像默认文件对象一样。其中包括
tarfile
和zipfile
模块。 -
Python 自己的
test.test_support
模块使用多个上下文管理器来检查特定警告、捕获stdout
、忽略特定异常并临时设置环境变量。
每当你想要检测代码块何时开始和/或结束时,你都希望使用上下文管理器。在将try:
与finally:
套件一起使用以保证清理之前,请改用上下文管理器。
我发现有一个contextmanager
版本的os.chdir()
很有用:退出时chdir()
回到原始目录。
这允许您模拟常见的 (Bourne) shell 脚本模式:
(
cd <some dir>
<do stuff>
)
即,您在子外壳((
)
)内更改为新的目录<some dir>
,以便即使<do stuff>
导致错误,您也能确保返回到原始目录。
比较 Python 中的上下文管理器和原版版本。 香草:
original_dir = os.getcwd()
os.chdir(<some dir>)
try:
<do stuff>
finally:
os.chdir(original_dir)
使用上下文管理器:
with os.chdir(<some dir>):
<do stuff>
后者要好得多!
Python Wiki 上有一些例子。
规范的答案是锁:
with (acquire some mutex):
# do stuff with mutex
下面是一个涉及锁和with
语句的堆栈溢出问题和答案。