Python 似乎缺少“所有数字”的基类,例如。 G。 int
、float
、complex
、long
(在 Python2 中)。不幸的是,这对我来说有点不方便。
我正在编写一个将数据类型相互匹配的函数(一种树匹配/搜索算法)。为此,我想测试输入值是否为 list
、dict
、str
ings 或“numbers”。四种情况分别处理,但我不想区分int
、long
、float
或complex
(虽然后者可能不会出现)。如果所有数字类型都派生自基本类型 number
,这将很容易实现,但不幸的是,它们不是,AFAICS。
这种明确性的实现使得不寻常的 complex
被包含在内变得显而易见。这通常会提出我不想考虑的问题。我的设计宁愿说“所有数字类型”而不是那个明确的列表。我也不想明确列出来自其他库(如 numpy
或类似库)的所有可能的数字类型。
第一个问题,更像是一个理论问题:为什么设计者不让所有的数字类型都继承一个公共(public)的数字基类?这是否有充分的理由,也许是关于它的理论似乎不推荐?还是为 Python 的更高版本提出这个想法是否有意义?
第二个问题,更实际的问题:是否有推荐的方法来检查一个值是否为数字,也许是我不知道的库调用?使用 isinstance(x, (int, float, complex, long))
的直接版本对我来说确实像是一个离合器,与不知道 long
类型,并且不包括基于库的数字类型,如 numpy.int32
。
最佳答案
您列出的那些类型实际上有一个基类。
如果您不查看 numpy 类型,一个好的起点是 numbers.Complex
:
>>> import numbers
>>> isinstance(1+9j, numbers.Complex)
True
>>> isinstance(1L, numbers.Complex)
True
>>> isinstance(1., numbers.Complex)
True
>>> isinstance(1, numbers.Complex)
True
当您开始包含来自 numpy 的那些时,它会变得有点困惑,但是,numbers.Complex
抽象基类已经处理了大量提到的情况。
关于Python数字基类或如何确定一个值是一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44756406/