我在我们的代码库中发现了一段对我来说似乎毫无用处的片段,但我怀疑有人出于某种原因而把它放在那里。所以我想问一下。该部分是这样的:
someParam = 'nope' # someParam is actually a query result, not a fixed string
if someParam != 'nope' and True or False
我认为and True or False
完全没有做任何评估,可以删除,因为第一部分是相等性检查,并与and True
(运算符优先级and
> { {1}}(IIRC)与第一部分相同:
如果第一部分的评估结果为True-> True和True-> True
如果第一部分为False-> False和True-> False
现在将这些结果与附加的or
:
是非题->是
错误或错误->错误
因此,如果删除or False
,条件的结果不会改变,对吗?还是我在这里想念东西?
从Python 2切换到3时,这种行为还会改变吗?我认为不是,但是我不太确定。
答案 0 :(得分:3)
您可以从if语句中删除和True或False ,因为它返回与 someParam!='nope'相同的结果。
您可以通过以下简单示例进行检查:
对与错
输出始终为 True ,而
错误和正确或错误
输出始终为 False
答案 1 :(得分:2)
正如您所说,表达式foo and True or False
只是将值foo
的“真实性”转换为实际布尔值的一种复杂方式:
>>> 'foo' and True or False # non-empty strings are truth-y
True
>>> '' and True or False # empty strings are false-y
False
(您可以看到内置类型的真实性here的规则。)
这是因为and
和or
每the docs返回一个操作数:
表达式
x and y
首先计算 x ;如果 x 为false,则其 返回值;否则,将评估 y 并得出结果值 返回。表达式
x or y
首先计算 x ;如果 x 为true,则其值为 返回;否则,将评估 y ,结果为 返回。
,正如您所说,and
的{{3}}高于or
。
由于许多原因,该代码是完全多余的:
因为Python已经为您提供了一种内置的方法,operator precedence:
>>> bool('foo')
True
>>> bool('')
False
因为foo
已经是布尔值了; !=
是一个比较, any bool
的结果是True
或False
,因此任何向布尔值的转换都是多余的。
因为在if foo:
这样的环境中,即使foo
尚未为布尔值,Python也会自动评估其真实性的foo
而不是仅接受布尔值,因此if foo and True or False:
和if bool(foo)
都是 毫无意义;您可以只写if foo:
。
不,在Python 2和3之间,以上几点均未更改。您可以在新版本中检查所有上述内容的等效链接:
答案 2 :(得分:1)
是的,当x and True or False
为布尔值时,x
可以简化为x
。