python 中 "with" 语句中的多个上下文管理器
Multiple context managers in a "with" statement in python
我很好奇为什么会出现下面的代码:
l1= threading.Lock()
l2= threading.Lock()
l3=threading.Lock()
with l1 and l2 and l3:
print l1.locked()
print l2.locked()
print l3.locked()
打印这个:
False
False
True
我意识到正确的语法是:
with l1, l2, l3:
但我正在尝试找到一个解释,解释为什么只有 l3 被锁定。
要理解这一点,请考虑 and
在 Python 中的工作原理。
表达式 x and y
的结果等同于 y if x else x
,只是它只对 x
求值一次。也就是说,当 bool(x)
为 True
时,and
运算符会导致 y
,否则会导致 x
(并且不会计算 y
).
除非对象定义了自己的 __bool__
dunder 方法,否则 bool(obj)
通常为 True
。锁定对象就是这种情况。所以 bool(l1)
是 True
,表达式 l1 and l2 and l3
的计算结果是 l2 and l3
。然后因为 bool(l2)
是 True
,这个表达式的计算结果是 l3
.
所以 with
语句最终管理锁 l3
,因此这就是 with
语句主体中锁定的那个。正如您所注意到的,如果您想一次管理多个锁,您应该将它们以逗号分隔。
我很好奇为什么会出现下面的代码:
l1= threading.Lock()
l2= threading.Lock()
l3=threading.Lock()
with l1 and l2 and l3:
print l1.locked()
print l2.locked()
print l3.locked()
打印这个:
False
False
True
我意识到正确的语法是:
with l1, l2, l3:
但我正在尝试找到一个解释,解释为什么只有 l3 被锁定。
要理解这一点,请考虑 and
在 Python 中的工作原理。
表达式 x and y
的结果等同于 y if x else x
,只是它只对 x
求值一次。也就是说,当 bool(x)
为 True
时,and
运算符会导致 y
,否则会导致 x
(并且不会计算 y
).
除非对象定义了自己的 __bool__
dunder 方法,否则 bool(obj)
通常为 True
。锁定对象就是这种情况。所以 bool(l1)
是 True
,表达式 l1 and l2 and l3
的计算结果是 l2 and l3
。然后因为 bool(l2)
是 True
,这个表达式的计算结果是 l3
.
所以 with
语句最终管理锁 l3
,因此这就是 with
语句主体中锁定的那个。正如您所注意到的,如果您想一次管理多个锁,您应该将它们以逗号分隔。