检查变量是否为数字(int, float, np)的最佳方法.Float32, np.int64,…)在python?&



我在这个问题上运行了很多次,从来没有找到一个满意的解决方案。

我想检查:变量some_var是数字类型吗?对我来说更具体一点:它能和另一个数字相比吗?(例如,字符串应该失败)

Numpy使得这不知怎么的困难,因为:

some_var = np.int32(123)
isinstance(some_var, int)
>>> False
<标题>可能的解决方案

numpy解:np.issubtype,与np.numbernp.isscalar

比较我发现np.issubtype作为解决方案,但对于非numpy类型,这将失败:

some_var = 123
np.issubdtype(some_var.dtype, np.number)
>>> AttributeError: 'int' object has no attribute 'dtype'

np.number可以用于比较,但对于非numpy类型也失败

isinstance(1, np.number)
>>> False

np.isscalar()工作良好,但也允许字符串:

np.isscalar('test')
>>>True

numbers模块

是与numbers模块的比较。这看起来很方便,但需要额外的导入。这可能是目前为止最好的解决方案。

from numbers import Integral
isinstance(some_var, Integral)
>>> True

手工测试

最清晰的方法当然是手工测试。

isinstance(some_var, (int, float, np.int32, np.int64, np.float32, np.float64))
>>> True
<标题>

我的问题我错过了一条路吗?
最值得推荐的是什么?

由于简短的回答没有抓住观众,这里有一个扩展的回答:因为每个包都可以实现自己的类型,所以没有泛型函数来检查存在的每个数字类型。

控制接受的变量类型也是可取的,因为包可以有不同的实现行为(例如整数除法1 / 10 = 0.1 or 1 / 10 = 0)。

因此一个简单的isNumeric检查是可取的。

现在我想到两个版本:

NUMERIC_TYPES = [int, float, ...] #to be extended by acceptable types
def isNumeric(val):
return isinstance(val, NUMERIC_TYPES)

但是有一个性能更好的版本(我的笔记本电脑15%)

NUMERIC_TYPES = set((int, float, np.int32, np.int64, np.float32, np.float64,...))
def isNumeric(val):
return type(val) in NUMERIC_TYPES

对于@CodePrinzisinstancetype(x)==是不一样的!

class StupidInt(int):
def __init__(self, val):
self._privateInt = val
def __add__(self, other):
return self._privateInt - other
a = StupidInt(10)
b = StupidInt(10)
print("a + b = 0? whaaat?")
print(a+b)
print("isInstance: {}".format(isinstance(a, int)))
print("is of type: {}".format(type(a) == int))
----
a + b = 0? whaaat?
0
isInstance: True
is of type: False