检查python类型的一致方法

时间:2013-05-24 10:18:36

标签: python reflection types

我发现python中的类型检查(前py3,我不确定py3中的状态)有点乱, 这就是我的意思:

首先,有内置类型(int,str等),以及'types'模块中定义的类型,其中 你必须导入类型模块并将其用作前缀。如果你,你可以轻松跳过这个障碍 获取您正在使用的类型的“名称未定义错误”,并尝试类型模块中的类型。

然后,有一个由type()函数打印出来的名字,你无法弄清楚它们的类型 对应 - 示例:

In [38]: type(Session.__dict__['mix']) 
Out[38]: staticmethod

In [39]: type(Session.__dict__['mix']) == staticmethod
Out[39]: True

好的,所以这个是内置类型。但那时:

In [47]: type(Session.__dict__['Cuser']) 
Out[47]: classobj

In [48]: type(Session.__dict__['Cuser']) == classobj
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-48-b062b09548fb> in <module>()
----> 1 type(Session.__dict__['Cuser']) == classobj

NameError: name 'classobj' is not defined

In [49]: type(Session.__dict__['Cuser']) == types.classobj
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-49-2a88e0b8e176> in <module>()
----> 1 type(Session.__dict__['Cuser']) == types.classobj

AttributeError: 'module' object has no attribute 'classobj'

'classobj'没有在类型模块documentation中进行调整, 但经过一些搜索,我发现它对应types.ClassType

In [50]: type(Session.__dict__['Cuser']) == types.ClassType
Out[50]: True

从上面的例子看,类型检查不是那么直接,我的问题是:是否有一种更一致的方法来检查那些我不知道的类型?

1 个答案:

答案 0 :(得分:2)

python强调duck-typing:

  

如果它像鸭子一样走路,像鸭子一样嘎嘎叫,它就是一只鸭子。

不是专注于类型,而是专注于属性。例如,如果hasattr(a,'next')(python 3中的hasattr(a,'__next__')),那么你知道a可以被视为可迭代的。