Python seems to lacks a base class for "all numbers", e. g. int
, float
, complex
, long
(in Python2). This is unfortunate and a bit inconvenient to me.
I'm writing a function for matching data types onto each other (a tree matching / searching algorithm). For this I'd like to test the input values for being list
s, dict
s, str
ings, or "numbers". Each of the four cases is handled separately, but I do not want to distinguish between int
, long
, float
, or complex
(though the latter will probably not appear). This would be rather easy to achieve if all number types would be derived from a base type number
, but unfortunately, they are not, AFAICS.
This enforcement of explicitness makes it obvious that the unusual complex
is included. Which typically raises questions which I rather not want to think about. My design rather says "all number types" than that explicit list. I also do not want to explicitly list all possible number types coming from other libraries like numpy
or similar.
First question, rather a theoretical one: Why didn't the designers make all number types inherit a common number base class? Is there a good reason for this, maybe a theory about it which lets it seem not recommended? Or would it make sense to propose this idea for later versions of Python?
Second question, the more practical one: Is there a recommended way of checking a value for being a number, maybe a library call I'm not aware of? The straight-forward version of using isinstance(x, (int, float, complex, long))
does look like a clutch to me, isn't compatible to Python3 which doesn't know a long
type anymore, and doesn't include library-based number types like numpy.int32
.
There is actually a base class for those types you listed.
If you're not looking at numpy types, a good starting point would be numbers.Complex
:
>>> import numbers
>>> isinstance(1+9j, numbers.Complex)
True
>>> isinstance(1L, numbers.Complex)
True
>>> isinstance(1., numbers.Complex)
True
>>> isinstance(1, numbers.Complex)
True
It gets a bit messier when you start to include those from numpy, however, the numbers.Complex
abstract base class already handles a good number of the mentioned cases.