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

标签 python inheritance types numbers base-class

Python 似乎缺少“所有数字”的基类,例如。 G。 intfloatcomplexlong(在 Python2 中)。不幸的是,这对我来说有点不方便。

我正在编写一个将数据类型相互匹配的函数(一种树匹配/搜索算法)。为此,我想测试输入值是否为 listdictstrings 或“numbers”。四种情况分别处理,但我不想区分intlongfloatcomplex(虽然后者可能不会出现)。如果所有数字类型都派生自基本类型 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/

相关文章:

python - 无法将字符串转换为 int

python - Django 默认语言不起作用

python - 使用字典过滤 pandas 数据框的列值

ruby - Ruby 中的类常量和类实例变量有什么区别?

arrays - 将数组中的所有项复制到引用类型的新数组中的函数

python - 傅里叶空间滤波

c++ - 如何强制两个函数参数具有相同的模板类型?

c# - 在不同的命名空间 C# 中重写方法

Scala 模式匹配在 2.10 中的递归类型上失败

c# - 在所有程序集中查找类型