样式指南如下:
# Correct:
if greeting:
# Wrong:
if greeting == True:
# Worse:
if greeting is True:
见PEP 8,搜索“更糟”一词
为什么会这样?我习惯于尽可能明确地检查条件,使代码更具可读性,并捕捉异常
考虑这个函数:
def f(do_it):
if do_it : print("doit")
else : print("no don't")
很容易滥用/监督,行为出人意料
>>> f("False")
doit
>>> f([False])
doit
例如,当您检查可能无意中传递if子句的返回值时,这是一个真正的问题。这可以通过使用is
构造来避免
显然,政治公众人物的推荐有很好的理由,但它是什么
在评论者的推动下,进一步的研究使我得出以下结论:
if x:
调用x类的_bool方法。该方法应该返回True或False,这取决于对象认为自己是这两个对象中的哪一个
if x==True:
调用x类的_eq方法。该方法应该能够将自身与True(或False)进行比较,并根据具体情况返回True或False
if x is True
两者都不起作用。这将测试x是否为“真”对象。它完全绕过了_eq和_bool方法
注意:我不是问==
和is
之间的区别。如果这就是你来这里的原因,请参见Is there a difference between "==" and "is"?
在理论层面上,
is
表达了错误的东西。我们关心的是价值的真实性,而不是身份。在我们确实关心身份的少数情况下,is
比较是合适的在实践层面上,
is True
甚至没有按照人们期望的方式工作:我们将1与1进行比较,得到一个看起来像
True
的东西,但是is
比较失败。这是因为bool
不是唯一的布尔类型。图书馆可以自由定义自己的图书馆flag
是numpy.bool_
的一个实例,它与True
是不同的对象。(NumPy有一个很好的理由——使用它们自己的布尔类型可以让它们提供更统一的0维值处理。这也是NumPy也有自己的数值标量类型的原因。)而且,}是一个问题,但是{}默默地什么也不做也是一个问题。两个版本的测试都不会产生实际的错误消息
is True
在您的示例中甚至没有发现问题。它只是把一种无声的错误行为转换成另一种f("False")
打印{因为它在逻辑上是错误的,a category mistake。使用
is
可以显式执行身份检查,即引用比较。但这不是你在这里想要做的。代码的意图是检查值是否真实(或者更严格地说,True
)。该值是否恰好与常量True
位于内存中的同一地址不仅无关紧要,而且会让人分心换句话说,代码的意图涉及表达式的值,因此检查其值,而不是其参考标识
相关问题 更多 >
编程相关推荐