Inconsistency between dict() and collections.OrderedDict() methods.

Erik python at lucidity.plus.com
Sat Apr 29 21:10:46 EDT 2017


On 30/04/17 01:31, Ben Finney wrote:
> Erik <python at lucidity.plus.com> writes:
>
>> On 29/04/17 23:40, Ned Batchelder wrote:
>>> For creating your own class that acts like a dict, you should derive
>>> from collections.abc.MutableMapping, which only requires
>>> implementing __getitem__, __setitem__, __delitem__, __iter__, and
>>> __len__.
>>
>> Or, I could derive from collections.OrderedDict and just implement the
>> two methods that I actually want to change the behavior of (did you
>> read the rest of my post?) ;)
>
> Did you read Ned's? :-)

Yes, I did. Which part of Ned's do you think I did not read properly?

> You say that there are only two methods you want to change the behaviour
> of;

Yes, __init__ (so that I can store the valid keys) and __setitem__ (so 
that I can check the key being set).

> but as you have found, those two methods are not the only ones you
> need to implement, in order to get the changed behaviour.

I didn't find that. But I found that I could change exactly those two 
methods if I just derived from a different class that also provides 
another behavior that I don't need (ordered keys).

> you need to implement the MutableMapping
> protocol if you want a custom class

Why do I "need" to do that when I could subclass from OrderedDict instead?

If I'm not being clear:

Is there not a class that is somewhere between "dict" and "OrderedDict" 
that provides what I need? collections.abc.MutableMapping is not that 
class, as it requires me to write all sorts of methods that are 
irrelevant to the behavior changes I want to make (__len__ etc).

E.



More information about the Python-list mailing list