Python数字基类OR如何确定一个数值是一个数字

Alf*_*lfe 5 python inheritance types numbers base-class

蟒蛇似乎缺乏一个基类"所有数字",例如int,float,complex,long(在Python2).这是不幸的,对我来说有点不方便.

我正在编写一个函数来匹配数据类型(树匹配/搜索算法).为此,我想测试lists,dicts,strings或"数字" 的输入值.每个四种情况分别处理,但我不想区分之间int,long,float,或complex(尽管后者可能不会出现).如果所有数字类型都是从基类型派生的,那么这很容易实现number,但不幸的是,它们不是AFAICS.

这种显性的强制使得很明显包含了不寻常的complex内容.这通常会引发我不想考虑的问题.我的设计相当于显示"所有数字类型"而不是显式列表.我也不想明确列出来自其他类似numpy或类似库的所有可能的数字类型.

第一个问题,而不是理论问题:为什么设计师不让所有数字类型继承一个共同的数字基类?有没有一个很好的理由,也许是关于它的理论让它看起来不推荐?或者为更高版本的Python提出这个想法是否有意义?

第二个问题,更实际的一个问题:是否有推荐的方法来检查数值是否为数字,也许是我不知道的库调用?使用的直接版本isinstance(x, (int, float, complex, long))对我来说看起来像一个离合器,与不再知道long类型的Python3不兼容,并且不包括基于库的数字类型numpy.int32.

Mos*_*oye 6

实际上,您列出的类型有一个基类.

如果你没有看到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
Run Code Online (Sandbox Code Playgroud)

当你开始包含来自numpy的那些时,它会变得有点麻烦,但是,numbers.Complex抽象基类已经处理了大量提到的案例.

  • ABC 可以实现 [`__isinstancecheck__`](https://docs.python.org/2/reference/datamodel.html#class.__instancecheck__),允许它们充当例如内置类的虚拟基类。它们可能未列在 mro 中。 (3认同)
  • @Alfe 当你使用 numpy 时要小心。AFAIK,它不适用于所有版本的 numpy。 (2认同)