【发布时间】:2014-12-08 04:22:10
【问题描述】:
我熟悉使用 python 的with 语句作为在抛出异常时确保对象最终确定的一种手段。这通常看起来像
with file.open('myfile.txt') as f:
do stuff...
简写为
f = file.open('myfile.txt'):
try:
do stuff...
finally:
f.close()
或任何其他类可能存在的终结例程。
我最近遇到了一段处理 OpenGL 的代码,它展示了这个:
with self.shader:
(Many OpenGL commands)
注意没有任何as 关键字。这是否表明该类的 __enter__ 和 __exit__ 方法仍将被调用,但该对象从未在块中显式使用(即,它通过全局或隐式引用工作)?或者还有什么其他的含义让我无法理解?
【问题讨论】:
-
如果您不需要在
with块中为上下文管理器起别名,那很好 - 另请参见例如contextlib.suppress。严格来说,你可以做with open(...): ...,虽然你不能访问文件处理程序,所以没有什么意义!
标签: python with-statement contextmanager