1

我正在编写一个 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 行,但如果命令是“开关三”,则不正确,“工作区 3”也有效,但“工作区三”无效。

所以,我的问题是,这里发生了什么?这里的条件流是什么,它是如何评估的?我怎样才能最好地解决它?我有一些想法(比如可能“工作区”被简单地评估为 True,因为它不与“in command”绑定并且被评估为布尔值),但我想对它有一个真正扎实的理解。

谢谢!

4

2 回答 2

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.
>>> 
于 2013-06-02T23:44:40.660 回答
2

"workspace" or "screen" or "desktop" or "switch"是一个表达式,它总是计算为"workspace".

Python 的对象具有真值。0, False,[]''是假的,例如。or表达式的结果是第一个计算结果为真的表达式。从这个意义上说,“workspace”是“true”:它不是空字符串。

你可能的意思是:

"workspace" in command or "screen" in command or "desktop" in command or "switch" in command

这是一种冗长的方式来说明@Ashwini Chaudhary 的用途any

于 2013-06-02T23:42:52.367 回答