在Java中,所有数字类型都是从Number继承而来的,因此我会使用
(x instanceof Number).
Python的等效语句是什么?
测试您的变量是否是数字.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
ABC的子类)则适用于所有第三方类。
但是,在许多情况下,您不必手动检查类型-Python是 duck typed,混合某些兼容类型通常可以工作,但当某些操作没有意义时(4 -“1”
),它将抛出错误消息,因此很少真正需要手动检查。这只是一个奖励。您可以在完成模块时添加它,以避免用实现细节麻烦他人。
这适用于从Python 2.6开始。在旧版本中,您基本上仅限于检查一些硬编码的类型。
isinstance(True, numbers.Number)
返回True
,即使True
显然不是数字。 - Alex Kahnbool
继承自int
,abs(True) == 1
,"foo" * False == ""
,sum([True, False, True]) == 2
,"%f" % True == "1.0"
等等。 - user395760isinstance(float('nan'), numbers.Number)
返回True
。 - Nateisinstance(x, numbers.Number) and not isinstance(x, bool)
- Scotttype(x) in (int, float, complex)
来检查 x
是否直接属于这些类型之一,而不是它们的实例。 - BreakPython 3:
=>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对象,此答案的工作方式不正确。
isinstance(Decimal(10), (int, long, float, complex))
的结果是False
。 - jpmc26x
是一个布尔值,这也不起作用。isinstance(True, (int, long, float, complex))
将返回True
。 - Alex Kahnisinstance(True, numbers.Number)
或者 isinstance(False, numbers.Number)
也会返回 True。 - nbrofloat('nan')
可以被视为非数值,但这当然仍将返回True
。 - Martin Thoma使用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
当然,这与鸭子类型相反。如果您更关心对象的行为而不是它的身份,请将操作视为具有数字并使用异常来告诉您其他情况。
+
或 *
并不意味着它与数字有任何相似之处。 - Tom Swirly当然你可以使用 isinstance
,但请注意这不是 Python 的工作方式。Python 是一种鸭子类型语言。你不应该显式地检查你的类型。如果传递了不正确的类型,将会引发一个 TypeError
。
所以只要假设它是一个 int
。不必费心检查。
try-except
中更好,因为这会使整个代码难以阅读。 - Guimoute那不是 Python 的工作方式。只需像使用数字一样使用它,如果有人传递给您的不是数字,则失败。将正确的类型传递给函数是程序员的责任。