¿Por qué OrderedDict no usa super?
Podemos crear unOrderedCounter
trivialmente mediante el uso de 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ígeme si me equivoco, pero esto se basa fundamentalmente en el hecho de queCounter
usossuper
:
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)
lossuper
la llamada debe delegar de acuerdo con 'hermanos antes de la regla de los padresmro, donde la clase personalizada usa unOrderedDict
como el backend de almacenamiento.
Sin embargo, un colega señaló recientemente, para mi sorpresa, queOrderedDict
no lo hace usar super:
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)
Al principio pensé que podría ser porqueOrderedDict
llegó primero y Raymond no se molestó en cambiarlo más tarde, pero parece quesuper
anterioresOrderedDict
.
Por queOrderedDict
llamadadict.__setitem__
¿explícitamente?
¿Y por qué necesita ser un kwarg? ¿Esto no causa problemas al usarOrderedDict
en situaciones de herencia de diamantes, ya que pasa directamente a la clase principal en lugar de delegar a la siguiente en la línea del mro?