python 'with' 语句用法的其他内置或实际示例



有没有人在 python 的文件对象实现之外有一个真实世界的例子,__enter____exit__用例?最好是你自己的,因为我试图实现的是概念化使用它的情况的更好方法。

我已经读过了。

而且,这是指向python文档的链接。

有很多用途。仅在标准库中,我们有:

  • sqlite3 ; 将连接用作上下文管理器将转换为提交或中止事务。

  • unittest ; 使用 assertRaises 作为上下文管理器可以断言引发异常,然后测试异常的各个方面。

  • decimal ; localcontext管理十进制数精度、舍入和其他方面。

  • threading对象(如锁、信号量和条件)也是上下文管理器;允许您为一组语句等获取锁。

  • warnings模块为您提供了一个上下文管理器来临时捕获警告。

  • 许多库提供关闭行为,就像默认文件对象一样。其中包括tarfilezipfile模块。

  • 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语句的堆栈溢出问题和答案。

相关内容

最新更新