当前位置: 首页 > 面试题库 >

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

马德宇
2023-03-14
问题内容

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

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

我已经看过尝试通过语句和上下文管理器来理解python的方法,但是我不确定上下文管理器的目的是什么?它只是“ try..finally ..”的替代语法还是它们的其他目的?


问题答案:

什么是上下文管理器?

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

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

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文档。



 类似资料:
  • 问题内容: 我习惯(宠坏了?)python的SQLite接口来处理SQL数据库。python的SQLite API中的一个不错的功能是“上下文管理器”,即python的语句。我通常以以下方式执行查询: 使用上面的代码,如果我的查询修改了数据库并且忘记了运行,则上下文管理器在退出语句后自动为我运行它。它还可以很好地处理异常:如果在我提交任何内容之前发生异常,则数据库将回滚。 我现在正在使用该接口,该

  • 问题内容: 我不明白为什么无法在此示例中模拟NamedTemporaryFile.name: 测试结果在: 问题答案: 您设置的模拟错误:不是上下文管理器,而是 返回 了一个上下文管理器。将您的设置行替换为: 这样您的测试就可以了。

  • 问题内容: 在这个问题中,我定义了一个包含上下文管理器的上下文管理器。完成此嵌套的最简单的正确方法是什么?我最后打电话了。但是,在中,我很确定我必须调用finally块,以防引发异常。如果出现问题,是否应该设置type_,value和traceback参数?我检查了,但找不到任何实用程序来帮助解决此问题。 来自问题的原始代码: 问题答案: 创建上下文管理器的简单方法是使用。像这样: 然后使用。语句

  • 本文向大家介绍Python多个上下文管理器,包括了Python多个上下文管理器的使用技巧和注意事项,需要的朋友参考一下 示例 您可以同时打开多个内容管理器: 它与嵌套上下文管理器具有相同的效果:            

  • 本文向大家介绍Python实现上下文管理器的方法,包括了Python实现上下文管理器的方法的使用技巧和注意事项,需要的朋友参考一下 问题 你想自己去实现一个新的上下文管理器,以便使用with语句。 解决方案 实现一个新的上下文管理器的最简单的方法就是使用 contexlib 模块中的 @contextmanager 装饰器。 下面是一个实现了代码块计时功能的上下文管理器例子: 在函数 timeth

  • 要使人晓得智慧和训诲,分辨通达的言语。使人处事,领受智慧、仁义、公平、正直的训诲。使愚人灵明、使少年人有知识和谋略。使智慧人听见、增长学问、使聪明人得着智谋、使人明白箴言和譬喻、懂得智慧人的言词和谜语。敬畏耶和华使知识的开端,愚妄人藐视智慧和训诲。 上下文管理器 在《文件(1)》中提到,如果要打开文件,一种比较好的方法是使用with语句,因为这种方法,不仅结构简单,更重要的是不用再单独去判断某种异