1

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

首先,有内置类型(int、str 等),以及在“types”模块中定义的类型,您必须在其中导入 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' 在类型模块文档中没有提及,但经过一番搜索,我发现它对应于types.ClassType

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

从上面的示例中可以看出类型检查并不是那么简单,我的问题是:是否有一种更一致的方式来检查我不知道的类型?

4

1 回答 1

2

python强调鸭式:

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

与其关注类型,不如关注属性。例如,如果 hasattr(a,'next') (hasattr(a,'__next__')在 python 3 中),那么您就知道a可以将其视为可迭代对象。

于 2013-05-24T11:56:24.597 回答