繁体   English   中英

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

[英]Best way to check if a variable is a number (int, float, np.float32, np.int64, ...) in 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

对于@CodePrinz isinstancetype(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM