上下文管理器在那里可以提供资源帮助(尽管可能会使用更多资源)。该 背景 是基本的资源。
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 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.
但是上下文管理器更易于使用,更舒适,更具可读性,并且可以实现__enter__
并__exit__
提供易于使用的界面。
或
创建上下文管理器是通过在常规类中实现__enter__()
并完成的__exit__()
。
__enter__()
告诉上下文管理器启动时和__exit__()
上下文管理器存在时的操作(__exit__()
如果发生异常,则将异常提供给方法)
在 可以找到创建上下文管理器的快捷方式。它将生成器包装为上下文管理器,如下所示:
from contextlib import contextmanager
@contextmanager
def tag(name):
print("<%s>" % name)
yield
print("</%s>" % name)
>>> with tag("h1"):
... print("foo")
...
<h1>
foo
</h1>
示例取自Python文档。