我正在阅读http://eigenhombre.com/2013/04/20/introduction-to-context-managers/。
在其中:
上下文管理器是一种在您需要的地方分配和释放某种资源的方法。最简单的例子是文件访问:
with file("/tmp/foo", "w") as foo:
print >> foo, "Hello!"
这基本上相当于:
foo = file("/tmp/foo", "w")
try:
print >> foo, "Hello!"
finally:
foo.close()
文章接着进行了更多解释,但我仍然不确定我是否理解他们的目的。有人可以澄清一下。什么是" context"?
我查看了Trying to understand python with statement and context managers,但我又不确定上下文管理器的用途是什么?它只是&#34的另一种语法;试试..终于.."或者是他们的其他目的
答案 0 :(得分:10)
上下文管理器可以帮助提供资源(尽管可能会用得更多)。 上下文基本上是资源。
假设你打开了一个写作文件:
f = open(path, "w")
您现在有一个打开的文件句柄。在处理文件期间,没有其他程序可以写入它。为了让其他程序写入它,您必须关闭文件句柄:
f.close()
但是,在关闭文件之前发生错误:
f = open(path, "w")
data = 3/0 # Tried dividing by zero. Raised ZeroDivisionError
f.write(data)
f.close()
现在将发生的是,函数或整个程序将退出,同时保留文件的打开句柄。 (CPython在终止时清除句柄,句柄与程序一起释放,但你不应该依赖它)
with语句确保一旦你留下它的缩进,它就会关闭文件句柄:
with open(path, "w") as f:
data = 3/0 # Tried dividing by zero. Raised ZeroDivisionError
f.write(data)
# Here, the file is already closed automatically, no matter what happened.
with
语句可用于更多内容。例如:threading.Lock()
lock = threading.Lock()
with lock: # Lock is acquired
do stuff...
# Lock is automatically released.
几乎所有使用上下文管理器完成的操作都可以使用try: ... finally: ...
完成,但上下文管理器使用起来更好,更舒适,更具可读性,并且可以通过实现__enter__
和{{ 1}}提供易于使用的界面。
或什么是__exit__
和__enter__
?
通过在普通班级中实施__enter__()
和__exit__()
来创建上下文管理器。
__exit__
告诉上下文管理器启动时要执行的操作以及上下文管理器存在时__enter__()
(如果发生异常,则为__exit__()
方法提供异常)
可以在 contextlib 中找到创建上下文管理器的快捷方式。它将生成器包装为上下文管理器,如下所示:
__exit__()
取自Python文档的示例。