我真的可以删除这些看似多余的代码而不破坏它们吗?

时间:2019-09-20 09:14:03

标签: python python-2.7

我在我们的代码库中发现了一段对我来说似乎毫无用处的片段,但我怀疑有人出于某种原因而把它放在那里。所以我想问一下。该部分是这样的:

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时,这种行为还会改变吗?我认为不是,但是我不太确定。

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的规则。)

这是因为andorthe docs返回一个操作数:

  

表达式x and y首先计算 x ;如果 x 为false,则其   返回值;否则,将评估 y 并得出结果值   返回。

     

表达式x or y首先计算 x ;如果 x 为true,则其值为   返回;否则,将评估 y ,结果为   返回。

,正如您所说,and的{​​{3}}高于or


由于许多原因,该代码是完全多余的:

  1. 因为Python已经为您提供了一种内置的方法,operator precedence

    >>> bool('foo')
    True
    >>> bool('')
    False
    
  2. 因为foo已经是布尔值了; !=是一个比较, any bool的结果是TrueFalse,因此任何向布尔值的转换都是多余的。

  3. 因为在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