哪种方法可以测试字典类型?

时间:2014-04-26 01:04:42

标签: 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, collections.Mapping)
Out[13]: True

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

2 个答案:

答案 0 :(得分:10)

types.DictTypetypes.DictionaryType已被弃用(嗯,在Python 3中删除)dict的别名。

collections.Mappingcollections.MutableMapping抽象基类(ABC),因此它们可以处理来自dict的子类化的映射。通常这会使它们成为更好的选择,尽管偶尔更严格的类型检查会有所帮助。

所以基本上,按顺序检查

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

  • collections.Mapping如果您不需要变异

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

  • dict如果您需要实际上 dict类型(这应该是罕见的)

  • types.DictTypetypes.DictionaryType如果您想支持非常旧的版本

答案 1 :(得分:2)

首先,types.DictTypetypes.DictionaryTypedict都是相同的(文档有效地指出前两个是dict的别名)。

最后两个是抽象基类,实际上会测试True对于完全不从dict继承的对象。如果你想测试一个对象是否像 dict-like 那样使用它们,即它是否实现了dict那样的操作。它们略有不同:Mapping用于一般映射(可能是不可变的),而MutableMapping严格用于可以修改的映射。