4

为什么有这么多不同的方法来测试字典?测试对象是否是字典的最现代方法是什么?

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
4

2 回答 2

10

types.DictType并且types.DictionaryType已弃用(好吧,在 Python 3 中已删除)别名dict.

collections.Mapping并且collections.MutableMapping抽象基类 (ABC),因此它们与不从dict. 通常这会使它们成为更好的选择,尽管偶尔更严格的类型检查会有所帮助。

所以基本上,按顺序检查

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

  • collections.Mapping如果你不需要突变

  • collections.MutableMapping如果你确实需要突变

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

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

于 2014-04-26T01:12:50.837 回答
2

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

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

于 2014-04-26T01:13:17.873 回答