簡體   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