有很多用途。仅在标准库中,我们就有:
sqlite3
; 使用上下文管理器作为连接,可以提交或中止事务。
unittest
; 使用assertRaises
上下文管理器,可以断言是否引发异常,并测试异常的方面。
decimal
; localcontext
上下文管理器 管理十进制数精度、舍入等方面。
threading
对象,如锁、信号量和条件,也是上下文管理器;可以让您获得一组语句的锁等。
warnings
模块提供了一个上下文管理器以临时捕获警告。
Python自己的 test.test_support
模块 使用了几个上下文管理器,以检查特定的警告、捕获stdout
、忽略特定的异常并临时设置环境变量。
try:
和finally:
套件来保证清理工作,现在可以使用上下文管理器代替。请注意保留HTML标签。我发现将 os.chdir()
写成一个contextmanager
的形式非常有用:退出时自动返回到原始目录。
这可以让你模仿一个常见的(Bourne)shell脚本模式:
(
cd <some dir>
<do stuff>
)
例如,您可以在子shell中更改到一个新的目录<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>