Python 测试字典类型的合适方法是什么?

Python 测试字典类型的合适方法是什么?,python,dictionary,isinstance,Python,Dictionary,Isinstance,为什么有这么多不同的方法来测试字典? 如果一个对象是字典,那么最现代的测试方法是什么 adict = {'a': 1} In [10]: isinstance(adict, types.DictType) Out[10]: True In [11]: isinstance(adict, types.DictionaryType) Out[11]: True In [12]: isinstance(adict, dict) Out[12]: True In [13]: isinstance

为什么有这么多不同的方法来测试字典? 如果一个对象是字典,那么最现代的测试方法是什么

adict = {'a': 1}

In [10]: isinstance(adict, types.DictType)
Out[10]: True

In [11]: isinstance(adict, types.DictionaryType)
Out[11]: True

In [12]: isinstance(adict, dict)
Out[12]: True

In [13]: isinstance(adict, collections.Mapping)
Out[13]: True

In [14]: isinstance(adict, collections.MutableMapping)
Out[14]: True

types.DictType
types.DictionaryType
dict
的别名,它们已被弃用(在Python 3中已被删除)

collections.Mapping
collections.MutableMapping
是抽象基类(ABC),因此它们使用的映射不是来自
dict
的子类。通常这会使他们成为更好的选择,尽管偶尔更严格的打字检查会有所帮助

所以基本上,对照,按顺序

  • 如果可能的话,没有一个(鸭子型)

  • collections.Mapping
    如果不需要变异

  • collections.MutableMapping
    如果您确实需要变异

  • dict
    如果您需要它实际上是一个
    dict
    类型(这应该很少)


  • types.DictType
    types.DictionaryType
    如果您想支持真正的旧版本


首先,
类型.DictType
类型.DictionaryType
dict
都是相同的(文档有效地指出前两个是
dict
的别名)


最后两个是抽象基类,实际上将测试根本不从
dict
继承的对象的
True
。如果要测试对象是否与dict类似,即它是否实现了
dict
将实现的相同类型的操作,则使用这些命令。它们略有不同:
Mapping
适用于一般映射(可能是不可变的),而
MutableMapping
则严格适用于可以修改的映射。

Python中的大多数内置类型也是如此。无论是对于遗留支持还是语法支持?最后三个都是针对不同但相关的内容进行测试。在一种语言中,一切都是一个支持多重继承的对象,而内置类型可以测试多种变体的
isinstance
,这为什么如此令人惊讶呢?有些语言的集合库要复杂得多,由比Python更细粒度的接口组成,例如Scala的
Scala.collection
是一个极端(但很好)的例子。@user2864740:我想你把问题标题改成了OP没有意思的东西;问“什么是正确的方法”和“为什么有这么多不同的方法”是一个很大的区别。为了明确“真正的旧版本”是什么意思-
isinstance(x,dict)
自2001年12月发布的Python 2.2中引入新样式类以来一直有效。