¿Por qué OrderedDict no usa super?

Podemos crear un OrderedCounter trivial utilizando la herencia múltiple:

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

Corríjame si me equivoco, pero esto se basa fundamentalmente en el hecho de que Counter usa super :

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

Es decir, el truco de magia funciona porque

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

La super llamada debe delegarse de acuerdo con los “hermanos antes de la regla de los padres” del mro , por lo que la clase personalizada utiliza un OrderedDict como el OrderedDict almacenamiento.

Sin embargo, un colega señaló recientemente, para mi sorpresa, que OrderedDict no usa super:

 def __setitem__(self, key, value, dict_setitem=dict.__setitem__, proxy=_proxy, Link=_Link): ... #  dict_setitem(self, key, value) 

Al principio, pensé que podría ser porque OrderedDict era lo primero y Raymond no se molestó en cambiarlo más tarde, pero parece que el super es anterior a OrderedDict .

¿Por qué OrderedDict llama a dict.__setitem__ explícitamente?

¿Y por qué tiene que ser un kwarg? ¿Esto no causa problemas al usar OrderedDict en situaciones de herencia de diamante, ya que pasa directamente a la clase padre en lugar de delegar a la siguiente línea en el mro?

Es una microoptimización. Buscar un argumento dict_setitem es un poco más rápido que buscar dict.__setitem__ o super().__setitem__ .

Esto podría causar problemas con la herencia múltiple si tiene otra clase que reemplaza a __setitem__ , pero OrderedDict no está diseñado para ese tipo de anulación de métodos con estructura de diamante de todos modos. Para que OrderedDict respalde, tendría que ofrecer garantías muy cuidadosas sobre lo que los métodos de otra clase podrían ver si intentan indexar el OrderedDict mientras que la información de pedido es inconsistente con la estructura dict. Tales garantías serían demasiado complicadas de hacer.