【问题标题】:What is the purpose of a context manager in python [duplicate]python中上下文管理器的目的是什么[重复]
【发布时间】:2016-08-02 06:11:06
【问题描述】:

我正在阅读 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()

文章继续进行更多解释,但我仍然不确定我是否能简单地理解它们的目的。有人可以澄清一下。还有什么是“上下文”?

我看过 Trying to understand python with statement and context managers ,但我再次不确定上下文管理器的目的是什么?它只是“try..finally..”的替代语法还是它们的其他目的

【问题讨论】:

  • 什么不清楚?
  • 我在问题底部添加了更多内容

标签: python


【解决方案1】:

什么是上下文管理器?

上下文管理器可以帮助使用资源(尽管可能会用于更多用途)。 context 基本上就是资源。

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

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____exit__ 提供了一个简单的使用界面。


上下文管理器是如何实现的?

__enter____exit__是什么?

通过在普通类中实现__enter__()__exit__() 来创建上下文管理器。

__enter__() 告诉上下文管理器启动时要做什么,__exit__() 告诉上下文管理器存在时要做什么(如果发生异常,则将异常提供给 __exit__() 方法)

可以在 contextlib 中找到创建上下文管理器的快捷方式。它将生成器包装为上下文管理器,如下所示:

from contextlib import contextmanager

@contextmanager
def tag(name):
    print("<%s>" % name)
    yield
    print("</%s>" % name)

>>> with tag("h1"):
...    print("foo")
...
<h1>
foo
</h1>

示例取自 Python 文档。

【讨论】:

  • 谢谢,这对我有帮助。你能多说一下 enterexit 方法吗?
  • @user1592380 完成。
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多