如何正确使用Python isinstance()检查,如果一个变量是多少?(How to prop

2019-06-25 18:50发布

我发现,在做类似一些老的Python代码:

if type(var) is type(1):
   ...

正如预期的那样, pep8抱怨的这个推荐使用isinstance()

现在的问题是, numbers模块在Python 2.6中添加的,我需要编写的Python代码工作2.5+

所以, if isinstance(var, Numbers.number)是不是一个解决方案。

这将是在这种情况下,妥善解决?

Answer 1:

在Python 2,你可以使用types模块 :

>>> import types
>>> var = 1
>>> NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType)
>>> isinstance(var, NumberTypes)
True

注意使用一个元组来测试针对多种类型。

引擎盖下, IntType只是一个别名int等:

>>> isinstance(var, (int, long, float, complex))
True

complex类型需要您的蟒蛇与复杂的数字支持编译; 如果你想守护这个使用try / except块:

>>> try:
...     NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType)
... except AttributeError:
...     # No support for complex numbers compiled
...     NumberTypes = (types.IntType, types.LongType, types.FloatType)
...

或者如果你只是直接使用类型:

>>> try:
...     NumberTypes = (int, long, float, complex)
... except NameError:
...     # No support for complex numbers compiled
...     NumberTypes = (int, long, float)
...

在Python 3 types不再有任何标准型的别名, complex始终处于启用状态不再有一个long VS int差别,所以在Python 3总是使用:

NumberTypes = (int, float, complex)

最后但并非最不重要的,你可以使用numbers.Numbers抽象基类 (新的Python 2.6),也支持自定义数值类型不直接从上述类型推导:

>>> import numbers
>>> isinstance(var, numbers.Number)
True

这种检查也返回Truedecimal.Decimal()fractions.Fraction()对象。

该模块确实让该假设complex类型被启用; 如果不是,你会得到一个导入错误。



Answer 2:

Python 2中支持四种类型为数字intfloatlongcomplexpython 3.x支持3: intfloatcomplex

>>> num = 10
>>> if isinstance(num, (int, float, long, complex)): #use tuple if checking against multiple types
      print('yes it is a number')

yes it is a number
>>> isinstance(num, float)   
False
>>> isinstance(num, int)
True
>>> a = complex(1, 2)
>>> isinstance(a, complex)
True


Answer 3:

根据您使用该在什么鸭打字可能是一个更好的方法(它确实 普遍 推荐 )。 用的Martijn Pieters的方法的问题是,你将永远怀念某些类型的号码从你的列表中。 关闭我的头顶,你的代码将无法正常工作与:sympy有理数,任意精度的整数和复数的任何实现。

一种选择是编写一个函数:

def is_number(thing):
    try:
        thing + 1
        return True
    except TypeError:
        return False

此代码应与任何合理地实施了许多的工作。 当然,有一个最大的缺点:它也将与不合理实现大量非数字的工作(即如果加上运营商超载并接受整数)。

另一种选择(取决于为什么你需要知道的东西是一个数字),就是假定它是一个数字,如果不是错误,将两者的代码位需要大量抛出。

我并不是说这些方法总是更好(不像某些人......),只是他们是值得考虑的。



文章来源: How to properly use python's isinstance() to check if a variable is a number?