我发现,在做类似一些老的Python代码:
if type(var) is type(1):
...
正如预期的那样, pep8
抱怨的这个推荐使用isinstance()
现在的问题是, numbers
模块在Python 2.6中添加的,我需要编写的Python代码工作2.5+
所以, if isinstance(var, Numbers.number)
是不是一个解决方案。
这将是在这种情况下,妥善解决?
我发现,在做类似一些老的Python代码:
if type(var) is type(1):
...
正如预期的那样, pep8
抱怨的这个推荐使用isinstance()
现在的问题是, numbers
模块在Python 2.6中添加的,我需要编写的Python代码工作2.5+
所以, if isinstance(var, Numbers.number)
是不是一个解决方案。
这将是在这种情况下,妥善解决?
在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
这种检查也返回True
为decimal.Decimal()
和fractions.Fraction()
对象。
该模块确实让该假设complex
类型被启用; 如果不是,你会得到一个导入错误。
Python 2中支持四种类型为数字int
, float
, long
和complex
和python 3.x
支持3: int
, float
和complex
>>> 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
根据您使用该在什么鸭打字可能是一个更好的方法(它确实 普遍 推荐 )。 用的Martijn Pieters的方法的问题是,你将永远怀念某些类型的号码从你的列表中。 关闭我的头顶,你的代码将无法正常工作与:sympy有理数,任意精度的整数和复数的任何实现。
一种选择是编写一个函数:
def is_number(thing):
try:
thing + 1
return True
except TypeError:
return False
此代码应与任何合理地实施了许多的工作。 当然,有一个最大的缺点:它也将与不合理实现大量非数字的工作(即如果加上运营商超载并接受整数)。
另一种选择(取决于为什么你需要知道的东西是一个数字),就是假定它是一个数字,如果不是错误,将两者的代码位需要大量抛出。
我并不是说这些方法总是更好(不像某些人......),只是他们是值得考虑的。