逻辑检查的Python执行顺序

gojuced7  于 2023-01-22  发布在  Python
关注(0)|答案(2)|浏览(89)

所以我的老板在对代码进行快速搜索和替换并打开一个Pull Request之后(偶然)想到了这个,其中tag总是一个字符串:

if "team_" in tag in tag:

令我惊讶的是,这真的起作用了!不是很确定为什么。我原以为会从左到右解析它,然后得到一个错误,就像这样

>>> ("team_" in "something") in "something"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not bool

或者甚至在最坏的情况下,从右到左解析它(我觉得这很奇怪,但让我们假设它是这样工作的)

>>> "team_" in ("something" in "something")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable

但我得到的却是

>>> "team_" in "something" in "something"
False
>>> 
>>> "some" in "something" in "something"
True
>>>

有人能给我解释一下那是怎么/为什么起作用的吗?

2izufjch

2izufjch1#

它工作的原因和
Python允许将比较运算符链接起来,因此这等效于
按照同样的逻辑

"team_" in tag in tag

相当于

"team_" in tag and tag in tag

tag是一个字符串时,它实际上只等价于"team_" in tag,因为字符串总是在它自己里面;但如果tag是一个列表或其他容器,它通常为false,因为容器通常不包含它自己的示例(可以进行递归引用,例如mylist.append(mylist),然后mylist in mylist为true)。

wztqucjr

wztqucjr2#

您将看到 * 链式比较 *(更经典的例子是a < b < c

"some" in "something" in "something"

等于

("some" in "something") and ("something" in "something")

所以它是有效的。
但如果你用括号保护一边,

("some" in "something") in "something"
     aka   True         in "something"

然后在一侧生成一个布尔值,它解释了错误消息(错误消息因一侧而异,左侧的错误消息拒绝在字符串中查找布尔值,右侧的错误消息拒绝迭代布尔值)
是的,这种自然语言的东西是危险的,可以意外编译(见一个经典问题:How to test multiple variables for equality against a single value?

相关问题