您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python中上下文管理器的目的是什么?

python中上下文管理器的目的是什么?

上下文管理器在那里可以提供资源帮助(尽管可能会使用更多资源)。该 背景 是基本的资源。

假设您打开了一个文件进行写入:

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.

但是上下文管理器更易于使用,更舒适,更具可读性,并且可以实现__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文档。

python 2022/1/1 18:34:53 有498人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶