我发现一些旧的Python代码正在执行以下操作:
if type(var) is type(1): ...
不出所料,pep8有人抱怨建议使用isinstance()。
pep8
isinstance()
现在的问题是,该numbers模块已添加到Python 2.6中,我需要编写适用于Python 2.5+的代码
numbers
所以if isinstance(var, Numbers.number)不是解决方案。
if isinstance(var, Numbers.number)
在这种情况下,哪种解决方案合适?
在Python 2中,您可以使用types模块:
types
>>> import types >>> var = 1 >>> NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType) >>> isinstance(var, NumberTypes) True
请注意使用元组来测试多种类型。
在幕后,IntType只是的别名int,等等:
IntType
int
>>> isinstance(var, (int, long, float, complex)) True
该complex类型要求您的python编译时支持复数;如果要对此进行保护,请使用try / except块:
complex
>>> 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始终启用,并且不再存在longvsint差异,因此在Python 3中始终使用:
long
NumberTypes = (int, float, complex)
最后但并非最不重要的一点是,您可以使用numbers.Numbers抽象基类型(Python 2.6中的新增功能)还支持不直接从上述类型派生的自定义数字类型:
numbers.Numbers
>>> import numbers >>> isinstance(var, numbers.Number) True
此检查也返回True了decimal.Decimal()和fractions.Fraction()对象。
True
decimal.Decimal()
fractions.Fraction()
该模块确实假定complex已启用该类型。如果不是,则会出现导入错误。