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

Nea*_*rdt 187 python types numbers

在Java中,数字类型都来自Number,所以我会使用

(x instanceof Number).
Run Code Online (Sandbox Code Playgroud)

什么是python等价物?

小智 233

在最近的Python版本中(2.6+;在旧版本中,您几乎只限于检查一些硬编码类型),正确的方法是测试您的变量是否是以下实例numbers.Number:

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

这使用了ABC,并且适用于所有内置数字类,也适用于所有第三方类,如果它们值得盐(注册为NumberABC的子类).但是,在许多情况下你不应该担心手动输入类型 - Python是鸭子类型并且混合稍微兼容的类型通常可以工作,但是当某些操作没有意义(4 - "1")时它会barf一条错误消息,所以手动检查这个很少真的需要.这只是奖励,您可以在完成此模块时添加它,以避免纠缠其他人的实现细节.

  • 当你传递一个布尔值时,这会产生误报:`isinstance(True,numbers.Number)`返回'True`,即使`True`显然不是数字. (6认同)
  • 小注释,如果你不小心尝试与不同类型的对象进行比较,你很容易被烧掉,因为那时对象的类型被比作字符串. (4认同)
  • @AlexKahn在Python中,布尔值实际上是数字:`bool`继承自`int`,`abs(True)== 1`,``foo"*False ==""`,`sum([True,False,True ])== 2`,`"%f"%True =="1.0"`,依此类推. (2认同)
  • 令人沮丧的是,```isinstance(float('nan'),numbers.Number)```返回```True``` (2认同)
  • 要排除布尔值,您可以使用以下内容。`isinstance(x,numbers.Number) 而不是 isinstance(x,bool)` (2认同)

Mat*_*att 170

我认为这会奏效:

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

  • `isinstance(Decimal(10),(int,long,float,complex))`给出'False`.-1 (10认同)
  • 如果`x`是布尔值,这也不起作用.`isinstance(True,(int,long,float,complex))`返回`True`. (9认同)
  • 谢谢,这是最终在Jython中工作的东西(这是python 2.5所以它没有'数字'包).是的,我有一个打破鸭子打字的真正理由; 我需要区别对待字符串和数字. (2认同)
  • @AlexKahn`isinstance(True,numbers.Number)`或`isinstance(False,numbers.Number)`也返回True. (2认同)
  • 简短说明:`float('nan')`可能被认为是非数字的,但这当然会仍然返回True。 (2认同)

Ste*_*ski 51

使用Numbernumbers模块测试isinstance(n, Number)(因为2.6可用).

isinstance(n, numbers.Number)
Run Code Online (Sandbox Code Playgroud)

这里有各种数字和一个非数字:

>>> 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
Run Code Online (Sandbox Code Playgroud)

当然,这与鸭子打字相反.如果您更关心对象的行为而不是它的作用,请执行操作,就好像您有一个数字并使用异常来告诉您.

  • "看看是否有例外"策略通常是无效的.Python在允许对各种非算术事物进行算术类操作方面有点积极 - 因为一个对象允许`+'或`*`并不意味着它就像数字一样. (8认同)