如何检查我的Python对象是否为数字?
在Java中,所有的数字类型都是从Number这个类派生出来的,所以我会使用
(x instanceof Number).
那在Python中对应的是什么呢?
5 个回答
63
使用来自 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)是相反的。如果你更关心一个对象的行为而不是它是什么,那就像对待数字一样进行操作,并用异常来告诉你情况是否不同。
241
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对象时会出现错误。
339
测试你的变量是否是 numbers.Number
的一种实例:
>>> import numbers
>>> import decimal
>>> [isinstance(x, numbers.Number) for x in (0, 0.0, 0j, decimal.Decimal(0))]
[True, True, True, True]
这个方法使用了 抽象基类(ABCs),适用于所有内置的数字类,也适用于所有第三方类,只要它们是合格的(注册为 Number
抽象基类的子类)。
不过,在很多情况下,你不需要手动检查类型——Python 是 鸭子类型 的,也就是说,只要类型之间有点相似,通常就能正常工作。但是,如果某个操作不合理(比如 4 - "1"
),就会报错,所以手动检查类型其实很少是必须的。这只是个额外的好处。你可以在完成一个模块时加上这个检查,以免让别人烦恼于实现细节。
这个方法从 Python 2.6 开始就可以用了。在更早的版本中,你只能检查几个硬编码的类型。