  # What is the most pythonic way to check if an object is a number?

StackOverflow

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.