Почему OrderedDict не использует super?

Мы можем создатьOrderedCounter тривиально с использованием множественного наследования:

>>> from collections import Counter, OrderedDict
>>> class OrderedCounter(Counter, OrderedDict): 
...     pass
...
>>> OrderedCounter('Mississippi').items()
[('M', 1), ('i', 4), ('s', 4), ('p', 2)]

Поправьте меня, если я ошибаюсь, но это в значительной степени зависит от того, чтоCounter использованияsuper:

class Counter(dict):
    def __init__(*args, **kwds):
        ...
        super(Counter, self).__init__()
        ...

То есть магический трюк работает, потому что

>>> OrderedCounter.__mro__
(__main__.OrderedCounter,
 collections.Counter,
 collections.OrderedDict,
 dict,
 object)

super Вызов должен делегировать в соответствии с «братьев и сестер, прежде чем правило родителейMROоткуда пользовательский класс используетOrderedDict в качестве хранилища данных.

Однако недавно мой коллега, к моему удивлению, отметил, чтоOrderedDict не использовать супер:

def __setitem__(self, key, value,
                dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link):
    ... 
    # <some weird stuff to maintain the ordering here>
    dict_setitem(self, key, value)

Сначала я думал, что это может быть потому, чтоOrderedDict пришел первым, и Раймонд не удосужился изменить его позже, но кажется, чтоsuper предшествующиеOrderedDict.

ПочемуOrderedDict вызовdict.__setitem__ явно?

И почему это должен быть kwarg? Не вызывает ли это проблемы при использованииOrderedDict в случаях наследования алмазов, так как он переходит непосредственно к родительскому классу, а не делегирует следующему в строке в mro?

Ответы на вопрос(1)

Ваш ответ на вопрос