Python 我真的能在不破坏东西的情况下删除这些看似多余的代码吗?

Python 我真的能在不破坏东西的情况下删除这些看似多余的代码吗?,python,python-2.7,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或False对评估没有任何作用,并且可以删除,因为第一部分、相等检查、and True

我在我们的代码库中发现了一个对我来说毫无用处的代码片段,但我怀疑有人把它放在那里是出于我无法理解的原因;所以我想问问周围的人。这个部分是这样的:

someParam = 'nope'  # someParam is actually a query result, not a fixed string
if someParam != 'nope' and True or False
在我看来,and True或False对评估没有任何作用,并且可以删除,因为第一部分、相等检查、and True运算符优先级和>或IIRC与第一部分相同:

如果第一部分的计算结果为True->True和True->True

如果第一部分为False->False和True->False

现在,这些结果加上附加的或False:

正确或错误->正确

假或假->假

所以,如果我删除了,条件的结果不会改变,对还是错,对吗?还是我在这里遗漏了什么

从Python2切换到Python3时,这种行为也会改变吗?我认为不是,但我不太确定。

是的,当x是布尔值时,x和True或False可以简化为x。

可以从if语句中删除和True或False,因为它返回与someParam相同的结果!='不,我会给你的

您可以通过以下简单示例进行检查:

真假

输出始终为True,而

假与真或假


输出总是False

正如您所说,表达式foo和True或False只是将值foo的真实性转换为实际布尔值的一种复杂方式:

>>> 'foo' and True or False  # non-empty strings are truth-y
True
>>> '' and True or False  # empty strings are false-y
False
您可以看到内置类型真实性的规则

这是因为and或返回其中一个操作数,每:

表达式x和y首先计算x;如果x为false,则其 返回值;否则,将计算y并计算结果值 他回来了

表达式x或y首先计算x;如果x为真,则其值为 被退回;否则,将计算y,结果值为 返回

正如你所说,for和高于or

该代码是完全冗余的,原因有很多:

因为Python已经为您提供了一种内置的实现方法:

因为foo已经是布尔值;!=是一个比较,并且any的结果是True或False,因此任何到boolean的转换都是多余的

因为在类似if foo:的上下文中,即使foo还不是布尔值,Python也会自动评估foo的真实性,而不仅仅是接受布尔值,因此如果foo和True或False:以及boolfoo都是无意义的;如果foo:,您可以直接编写

不,在Python2和Python3之间,上述几点都没有改变。您可以在新版本中检查上述所有内容的等效链接:


可能是一个被遗忘的调试工件,尽管我无法想象具体的场景。我很难想象有人会在没有动机的情况下直接写这篇文章,这与不擅长编码的人通常会做的任何奇怪的事情都不一样。当然,但是param的值不是一个固定的字符串,我这样说是为了不分散问题的重点:条件的后面部分。对不起,这个问题不清楚。顺便说一句:应该为此负责的人10多年前离开了公司。。。不只是当x是一个布尔值时,尽管在这种情况下它是没有意义的。你是对的,对不起。我在考虑if/while中的上下文,但通常不是这样。试试看………啊哈,我担心忽略了一些东西,事实上我不知道and和or运算符返回的是一个输入值,而不是布尔值。因此,感谢您抽出时间撰写如此全面的答案:>
>>> bool('foo')
True
>>> bool('')
False