Python似乎缺少"所有数字",e的基类。 G。 int
,float
,complex
,long
(在Python2中)。这是不幸的,对我来说有点不方便。
我正在编写一个函数,用于将数据类型相互匹配(树匹配/搜索算法)。为此,我想测试list
,dict
s,str
或"数字"的输入值。四个案例中的每一个都是单独处理的,但我不想区分int
,long
,float
或complex
(尽管后者可能不会出现) 。如果所有数字类型都是从基类型number
派生的,那么这很容易实现,但不幸的是,它们不是,AFAICS。
这种显性的强制使得很明显包含了异常的complex
。这通常会引发我不想考虑的问题。我的设计相当于所有数字类型"比那个明确的清单。我也不想明确列出来自其他库的所有可能的数字类型,例如numpy
或类似的。
第一个问题,而不是理论问题:为什么设计师没有让所有数字类型继承一个公共数字基类?有没有一个很好的理由,也许是关于它的理论让它看起来不推荐?或者为更高版本的Python提出这个想法是否有意义?
第二个问题,更实用的一个:是否有推荐的方法来检查作为数字的值,也许是我不知道的库调用?使用isinstance(x, (int, float, complex, long))
的直接版本确实看起来像是一个离合器,不兼容Python3,它不再知道long
类型,并且不会包括基于库的数字类型,如numpy.int32
。
答案 0 :(得分:5)
实际上是您列出的那些类型的基类。
如果你没有看到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
抽象基类已经处理了大量提到的案例。
答案 1 :(得分:1)
抱歉,聚会有点晚了。但这可能对本页的未来读者有所帮助。我建议您使用 Python 的“鸭子输入”字符及其 EAFP(“比许可更容易请求宽恕”)理念:换句话说,只需尝试将有问题的对象用作数字即可。像这样写:
def isnumber(thing):
try:
thing + 0
return True
except TypeError:
return False
它应该适用于任何类型的数字,包括用户定义的类。