gpt4 book ai didi

python - 在 with 语句中或之前评估和分配表达式

转载 作者:太空宇宙 更新时间:2023-11-03 14:03:36 26 4
gpt4 key购买 nike

如果我是正确的,with 语句不会为 with 语句引入局部作用域。

这些是 Learning Python 中的示例:

with open(r'C:\misc\data') as myfile:
for line in myfile:
print(line)
...more code here...

lock = threading.Lock()                        # After: import threading
with lock:
# critical section of code
...access shared resources...

第二个示例是否等同于以下以类似于第一个示例的方式重写?

with threading.Lock() as lock:
# critical section of code
...access shared resources...

它们有什么区别?

第一个示例是否等同于以下以类似于第二个示例的方式重写?

myfile = open(r'C:\misc\data')
with myfile:
for line in myfile:
print(line)
...more code here...

它们有什么区别?

最佳答案

with进入上下文,它调用上下文管理器对象上的钩子(Hook),称为 __enter__ ,并且可以选择使用 as <name> 将该 Hook 的返回值分配给一个名称.许多上下文管理器返回 self来自他们的 __enter__钩。如果他们这样做,那么您确实可以在单独的行上创建上下文管理器或使用 as 捕获对象之间进行选择。 .

在你的两个例子中,只有从 open() 返回的文件对象有一个 __enter__返回 self 的钩子(Hook).对于 threading.Lock() , __enter__返回与 Lock.acquire() 相同的值,所以是一个 bool 值,而不是锁对象本身。

您需要查找明确的文档来确认这一点;然而,这并不总是那么清楚。对于 Lock对象,relevant section of the documentation状态:

All of the objects provided by this module that have acquire() and release() methods can be used as context managers for a with statement. The acquire() method will be called when the block is entered, and release() will be called when the block is exited.

对于文件对象, IOBase documentation相当模糊,您必须从返回文件对象的示例中推断出来。

要带走的主要内容是返回self不是强制性的,也不是总是需要的。上下文管理器可以完全自由地返回其他内容。例如,许多数据库连接对象是上下文管理器,可让您管理事务(自动回滚或提交,具体取决于是否存在异常),其中输入返回绑定(bind)到连接的新游标对象。

明确地说:

  • 为您的 open()例如,这两个示例的所有意图和目的完全相同。双方都调用open() ,如果没有引发异常,您最终会引用名为 myfile 的文件对象。 .在这两种情况下,文件对象都将在 with 之后关闭。语句完成。该名称在 with 之后继续存在语句完成。

    有区别,但主要是技术上的。对于 with open(...) as myfile: ,文件对象被创建,它是__enter__调用方法然后 myfile被绑定(bind)。对于 myfile = open(...)案例,myfile首先绑定(bind),__enter__稍后调用。

  • 为您的 with threading.Lock() as lock:例如,使用 as lock将设置 lockTrue (锁定总是以这种方式成功或无限期地阻塞)。这不同于 lock = threading.Lock()案例,其中 lock绑定(bind)到锁对象。

关于python - 在 with 语句中或之前评估和分配表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46225137/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com