Why are there so many different ways to test for a dictionary? And what would be the most modern way to test if an object is a dictionary?
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 and types.DictionaryType are deprecated (well, removed in Python 3) aliases of dict.
collections.Mapping and collections.MutableMapping are Abstract Base Classes (ABCs) so they work with mappings that don't subclass from dict. Normally that makes them a better choice, although very occasionally the stricter typecheck will be helpful.
So basically, check against, in order
None of them, if possible (duck-type)
collections.Mapping if you don't need mutation
collections.MutableMapping if you do need mutation
dict if you need it to actually be a dict type (this should be rare)
types.DictType or types.DictionaryType if you want to support really old versions
First, types.DictType, types.DictionaryType, and dict are all the same (the documentation effectively notes that the first two are aliases for dict).
The last two are abstract base classes, and will actually test True for objects that don't inherit from dict at all. These are used if you want to test if an object is dict-like, i.e. whether it implements the same sort of operations that dict would. They are slightly different: Mapping is for general mappings (that may be immutable), whereas MutableMapping is strictly for mappings that can be modified.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With