python中上下文管理器的用途是什么

时间:2016-04-11 21:29:08

标签: python

我正在阅读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的另一种语法;试试..终于.."或者是他们的其他目的

1 个答案:

答案 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文档的示例。