我只花了半个小时研究了statsmodels的SARIMAX功能中的一个bug,最终我可以追溯到数字.int32int类型检查失败
>>> import numpy as np
>>> foo = np.int32(3)
>>> isinstance(foo, int)
False
有没有办法在没有显式类型转换的情况下规避这种问题? 正确的代码是否应该测试类型,而不是检查变量是否可以安全地转换为类型?在
编辑:我的问题的答案是什么技术限制或设计决策是导致这种行为的原因,以及如何pythonical处理纯python的int
和numpyint32
或int64
类型可能出现的情况。在
为什么应该从^{下降?}继承对于实现
int
是一个特定的类。这是表示整数的一种方法。这并不意味着每个表示整数的类都应该从int
开始。numpy.int32
具有不同的语义和不同的方法(例如,它具有像0维数组一样操作所需的大部分功能),从{numpy.int32
并不是特别有用。在在Python2的某些版本上(仅限Windows?),实际上,}不存在。那是一个比较合理的决定。在
numpy.int32
将从int
(在那些构建中也是32位的),但我相信这个设计决定可以追溯到int
执行了类似numpy.int32
的环绕算法,而不是在溢出时提升为long
,并且{至于如何将
numpy.int32
视为int
,numbers.Integral
做得还不错,但实现依赖于人们显式地register
-用numbers.Integral
来处理他们的类,而人们通常不这么想。NumPy直到register
调用才添加,直到numbers.Integral
引入了numbers.Integral
之后的2014。类似的图书馆,如SymPy仍然没有电话。在我发现
operator.index
是一个更好的检查方法:operator.index
是类int类必须实现的钩子,以使其实例可用作序列索引。这是一个比int(x)
更严格的检查,它将接受3.5
和{numbers.Integral
支持更可能存在。在__mro__
列出类的继承堆栈:对于基本阵列:
^{pr2}$此堆栈上类的
isinstance
返回True:int
不在此堆栈上:item
从其numpy
包装中提取一个值:@kazemakase建议使用
numbers
模块:相关问题 更多 >
编程相关推荐