我如何检查我的python对象是否是一个数字?

在Java中,数字类型都是从数字派生的,所以我会使用

(x instanceof Number).

python的等价是什么?

312991 次浏览

这并不是python的工作原理。就像使用数字一样使用它,如果有人传递给你不是数字的东西,那就失败了。传递正确的类型是程序员的责任。

Python 3:

isinstance(x, (int, float, complex)) and not isinstance(x, bool)

Python 2:

isinstance(x, (int, long, float, complex)) and not isinstance(x, bool)

注意,这个答案对于Numpy对象是不正确的。

测试你的变量是否是numbers.Number的一个实例:

>>> import numbers
>>> import decimal
>>> [isinstance(x, numbers.Number) for x in (0, 0.0, 0j, decimal.Decimal(0))]
[True, True, True, True]

这将使用abc,并将适用于所有内置的类数字类,也适用于所有第三方类,如果它们是值得的(注册为Number ABC的子类)。

然而,在许多情况下,你不应该担心手动检查类型——Python是鸭子类型,混合一些兼容的类型通常是可行的,但当某些操作没有意义时,它会抛出一个错误消息(4 - "1"),所以手动检查这种情况很少真正需要。这只是额外的奖励。您可以在完成一个模块时添加它,以避免用实现细节打扰其他人。

这是从Python 2.6开始。在较旧的版本中,您几乎仅限于检查一些硬编码的类型。

当然,你可以使用isinstance,但请注意,这不是Python的工作方式。Python是一种鸭子类型的语言。不应该显式地检查类型。如果传递了不正确的类型,将引发TypeError

所以只要假设它是int。别费心去查了。

使用numbers模块中的Number来测试isinstance(n, Number)(从2.6开始可用)。

isinstance(n, numbers.Number)

下面是各种各样的数字和一个非数字:

>>> from numbers import Number
... from decimal import Decimal
... from fractions import Fraction
... for n in [2, 2.0, Decimal('2.0'), complex(2,0), Fraction(2,1), '2']:
...     print '%15s %s' % (n.__repr__(), isinstance(n, Number))
2 True
2.0 True
Decimal('2.0') True
(2+0j) True
Fraction(2, 1) True
'2' False

当然,这与duck typing相反。如果你更关心的是一个对象是如何工作的,而不是它是什么,就像你有一个数字一样执行你的操作,并使用异常来告诉你其他情况。