有人可以解释以下脚本输出背后的逻辑吗?
import numpy
if(numpy.dtype(numpy.float64) == None):
print "Surprise!!!!"
谢谢 :)
看起来像是一场不幸的事故:有人决定dtype(None)
将“默认”浮动(尽管dtype()
是一个错误)。然后别人写了dtype.__eq__
这样它在比较之前将其第二个参数转换为数据类型。所以dtype(float) == None
is dtype(float) == dtype(None)
这是真的。
您可以在此处看到源代码中的注释:描述符.c#L1217
- 从对象获取 typenum -- None 转到 NPY_DEFAULT_TYPE
当然 NPY_DEFAULT_TYPE 是浮动的(至少通常是这样)。
至于__eq__
运算符,它在这里:描述符.c#L3317。它执行我概述的操作:
if (!PyArray_DescrCheck(other)) {
if (PyArray_DescrConverter(other, &new) == NPY_FAIL) {
return NULL;
}
}
所以这是从右侧的任何内容进行的转换==
通过前面提到的转换器函数转换为 dtype 对象,该函数将None
into dtype(float)
.
Edit:我发现这很有趣,而且看起来像是一个意外,所以我创建了一个补丁并提交给维护人员:https://github.com/numpy/numpy/pull/4532 .
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)