我发现一些旧的 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
类型要求您的 python 在编译时支持复数;如果您想对此进行防范,请使用 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 3types
中不再有任何标准类型别名,complex
始终启用并且不再存在long
vsint
差异,因此在 Python 3 中始终使用:
NumberTypes = (int, float, complex)
最后但同样重要的是,您可以使用numbers.Numbers
抽象基类型(Python 2.6 中的新类型)来支持不直接从上述类型派生的自定义数字类型:
>>> import numbers
>>> isinstance(var, numbers.Number)
True
此检查还返回True
fordecimal.Decimal()
和fractions.Fraction()
对象。
该模块确实假设complex
启用了该类型;如果不是,您将收到导入错误。
Python 2 支持数字int
、、和的四种类型float
,并支持 3 :和long
complex
python 3.x
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
此代码应与数字的任何合理实现一起使用。当然有一个主要的缺点:它也适用于大量非数字的不合理实现(即,如果加号运算符被重载并接受整数)。
另一种选择(取决于您为什么需要知道某物是否是数字)是假设它是一个数字,如果不是,则任何需要数字的代码位都会抛出错误。
我并不是说这些方法总是更好(不像某些人......)只是它们值得考虑。