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 语句主体中锁定的那个。正如您所注意到的,如果您想一次管理多个锁,您应该将它们以逗号分隔。