gpt4 book ai didi

python - python vs numpy中的 boolean 和类型检查

转载 作者:太空狗 更新时间:2023-10-29 17:26:37 26 4
gpt4 key购买 nike

我今天在 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() 返回的 typenumpy.bool_ 而不是普通的旧 bool,显然如果 foo = numpy.bool_(1),那么 if foo 将评估为 Trueif foo is True 将评估为 False。这似乎是 is 运算符的工作。

我的问题是:为什么 numpy 有自己的 boolean 类型,鉴于这种情况,最佳实践是什么?在上面的示例中,我可以通过编写 if foo: 来获得预期的行为,但我喜欢更严格的 if foo is True: 因为它排除了像 2[2] 从返回 True,有时需要显式类型检查。

最佳答案

你正在做一些被认为是反模式的事情。报价 PEP 8 :

Don't compare boolean values to True or False using ==.

Yes:   if greeting:
No: if greeting == True:
Worse: if greeting is True:

numpy 并不是为了方便您的非 Python 代码而设计的,这并不是 numpy 中的错误。事实上,这是为什么你的个人习语是反模式的完美例子。


正如 PEP 8 所说,使用 is True 甚至比 == True 还要糟糕。为什么?因为您正在检查对象身份:不仅结果必须在 boolean 上下文中为真(这通常是您所需要的),并且等于 boolean True 值,它实际上必须 常量True。很难想象在任何情况下这都是您想要的。

而且你特别不想在这里:

>>> np.True_ == True
True
>>> np.True_ is True
False

因此,您所做的只是明确地使您的代码与 numpy 以及各种其他 C 扩展库不兼容(可以想象,纯 Python 库可以返回一个等于 True 的自定义值,但是我不知道有谁这样做)。


在您的特定情况下,没有理由排除 2[2]。如果您阅读 numpy.allclose 的文档,它显然不会退回它们。但是考虑其他一些函数,比如标准库中的许多函数,它们只是说它们评估为真或假。这意味着他们被明确允许返回他们真实的论点之一,而且经常会这样做。为什么你会认为这是错误的?


最后,为什么 numpy 或任何其他 C 扩展库会定义这种 bool-compatible-but-not-bool 类型?

一般来说,这是因为它们包装了 C int 或 C++ bool 或其他类似类型。在 numpy 的情况下,它包装了一个值,该值可以存储在最快的机器字类型或单个字节(在某些情况下甚至可能是单个位)中以适合性能,并且您的代码不必关心哪个,因为所有表示看起来都一样,包括真实且等于 True 常量。

关于python - python vs numpy中的 boolean 和类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com