Given an arbitrary python object, what's the best way to determine whether it is a number? Here is
is defined as acts like a number in certain circumstances
.
For example, say you are writing a vector class. If given another vector, you want to find the dot product. If given a scalar, you want to scale the whole vector.
Checking if something is int
, float
, long
, bool
is annoying and doesn't cover user-defined objects that might act like numbers. But, checking for __mul__
, for example, isn't good enough because the vector class I just described would define __mul__
, but it wouldn't be the kind of number I want.
Use Number
from the numbers
module to test isinstance(n, Number)
(available since 2.6).
>>> 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(f'{n!r:>14} {isinstance(n, Number)}')
2 True
2.0 True
Decimal('2.0') True
(2+0j) True
Fraction(2, 1) True
'2' False
This is, of course, contrary to duck typing. If you are more concerned about how an object acts rather than what it is, perform your operations as if you have a number and use exceptions to tell you otherwise.