为什么有这么多不同的方法来测试字典? 如果一个对象是一个字典,最现代的测试方法是什么?
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
答案 0 :(得分:10)
types.DictType
和types.DictionaryType
已被弃用(嗯,在Python 3中删除)dict
的别名。
collections.Mapping
和collections.MutableMapping
是抽象基类(ABC),因此它们可以处理来自dict
的子类化的映射。通常这会使它们成为更好的选择,尽管偶尔更严格的类型检查会有所帮助。
所以基本上,按顺序检查
如果可能的话,没有一个(鸭型)
collections.Mapping
如果您不需要变异
collections.MutableMapping
如果确实需要变异
dict
如果您需要实际上 dict
类型(这应该是罕见的)
types.DictType
或types.DictionaryType
如果您想支持非常旧的版本
答案 1 :(得分:2)
首先,types.DictType
,types.DictionaryType
和dict
都是相同的(文档有效地指出前两个是dict
的别名)。
最后两个是抽象基类,实际上会测试True
对于完全不从dict
继承的对象。如果你想测试一个对象是否像 dict-like 那样使用它们,即它是否实现了dict
那样的操作。它们略有不同:Mapping
用于一般映射(可能是不可变的),而MutableMapping
严格用于可以修改的映射。