什么是上下文管理器?
上下文管理器在那里可以提供资源帮助(尽管可能会使用更多资源)。该 背景 是基本的资源。
假设您打开了一个文件进行写入:
f = open(path, "w")
您现在有了一个打开的文件句柄。在处理文件期间,没有其他程序可以写入该文件。为了让其他程序对其进行写入,必须关闭文件句柄:
f.close()
但是,在关闭文件之前发生了错误:
f = open(path, "w")data = 3/0 # Tried dividing by zero. Raised ZeroDivisionErrorf.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__并
__exit__提供易于使用的界面。
上下文管理器如何实施?
或 什么是__enter__
和__exit__
?
创建上下文管理器是通过在常规类中实现
__enter__()并完成的
__exit__()。
__enter__()告诉上下文管理器启动时和
__exit__()上下文管理器存在时的操作(
__exit__()如果发生异常,则将异常提供给方法)
在
contextlib中
可以找到创建上下文管理器的快捷方式。它将生成器包装为上下文管理器,如下所示:
from contextlib import contextmanager@contextmanagerdef tag(name): print("<%s>" % name) yield print("</%s>" % name)>>> with tag("h1"):... print("foo")...<h1>foo</h1>
示例取自Python文档。



