我正在编写一个python程序,它在计划英语中使用给定的句子并从中提取一些命令。它现在非常简单,但我的命令解析器得到了一些意想不到的结果。在仔细研究之后,似乎我的条件逻辑没有像我预期的那样进行评估。
这当然是一种非常不优雅的方式,而且过于冗长。我将完全重组它,可能使用神经网络或正则表达式或它们的组合。但我确实想要在我前进之前理解这个错误背后的逻辑,因为这是一个非常重要的事情要知道。这是代码的一部分:
if (("workspace" or "screen" or "desktop" or "switch") in command) and
(("3" or "three" or "third") in command):
os.system("xdotool key ctrl+alt+3")
result = True
奇怪的是,如果命令是“桌面三”,这个正确的评估和制定xdotool行,但如果命令是“switch three”,那么也不是“工作区3”,但不是“工作空间3”。
所以,我的问题是,这里发生了什么?这里的条件流是什么,它是如何评估的?我怎么能最好地解决它?我有一些想法(比如可能的“工作空间”总是被简化为True,因为它没有与“in command”绑定并被评估为布尔值),但我希望对它有一个非常可靠的理解。
谢谢!
答案 0 :(得分:3)
在此处使用any
:
screens = ("workspace" , "screen" , "desktop" , "switch")
threes = ("3" , "three", "third")
if any(x in command for x in screens) and any(x in command for x in threes):
os.system("xdotool key ctrl+alt+3")
result = True
布尔or
:
x or y
等于:if x is false, then y, else x
简单来说:在一系列or
条件中,选择了第一个True
值,如果所有值均为False
,则选择最后一个值。
>>> False or [] #all falsy values
[]
>>> False or [] or {} #all falsy values
{}
>>> False or [] or {} or 1 # all falsy values except 1
1
>>> "" or 0 or [] or "foo" or "bar" # "foo" and "bar" are True values
'foo
由于python中的非空字符串为True,因此您的条件等同于:
("workspace") in command and ("3" in command)
any
上的帮助:
>>> print any.__doc__
any(iterable) -> bool
Return True if bool(x) is True for any x in the iterable.
If the iterable is empty, return False.
>>>
答案 1 :(得分:2)
"workspace" or "screen" or "desktop" or "switch"
是一个表达式,总是评估为"workspace"
。
Python的对象具有真值。例如,0
,False
,[]
和''
都是错误的。 or
表达式的结果是第一个计算结果为true的表达式。在这个意义上,“workspace”是“真实的”:它不是空字符串。
"workspace" in command or "screen" in command or "desktop" in command or "switch" in command
这是一个详细说明@Ashwini Chaudhary使用any
的内容的方式。