【发布时间】:2013-09-26 04:11:24
【问题描述】:
我今天在 python if 子句中遇到了意想不到的结果:
import numpy
if numpy.allclose(6.0, 6.1, rtol=0, atol=0.5):
print 'close enough' # works as expected (prints message)
if numpy.allclose(6.0, 6.1, rtol=0, atol=0.5) is True:
print 'close enough' # does NOT work as expected (prints nothing)
经过一番摸索(即this question,尤其是this answer),我明白了原因:numpy.allclose() 返回的type 是numpy.bool_,而不是普通的旧bool,显然如果foo = numpy.bool_(1),则if foo 将评估为True,而if foo is True 将评估为False。这似乎是 is 操作员的工作。
我的问题是:为什么 numpy 有自己的布尔类型,鉴于这种情况,最佳实践是什么?在上面的示例中,我可以通过编写if foo: 来获得预期的行为,但我更喜欢更严格的if foo is True:,因为它排除了2 和[2] 之类的返回True,有时甚至是显式类型检查是可取的。
【问题讨论】:
-
您使用的是 Python 2,其中 True 不是关键字,因此 True 可能已被重新定义。因此,
is True不一定能证明任何类型,因为True可能是("not quite True", 7)。if foo is (True is True):或其他东西应该可以工作,不过..(鸭子和奔跑) -
@DSM: 确实如此(但
is它是True?),但我认为这不是他所做的最严重的问题。此外,虽然您的技巧可以解决任何返回原始True的函数的问题(来自不同模块的全局变量、来自闭包或本地副本、来自使用Py_True的 C 扩展等),但它会 break 返回当前全局True的任何函数。为了调试它,我认为你需要阅读 Kripke。 :)