Подклассы из OrderedDict и defaultdict

Раймонд Хеттингер показал действительно классный способ комбинировать коллекции:

from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
  pass
# if pickle support is desired, see original post

Я хочу сделать что-то подобное для OrderedDict и defaultdict. Но, разумеется, defaultdict имеет другую подпись __init__, поэтому она требует дополнительной работы. Какой самый чистый способ решить эту проблему? Я использую Python 3.3.

Я нашел хорошее решение здесь: qaru.site/info/41579/..., но я думал, что, возможно, из-за отказа от defaultdict это упростит?

Ответ 1

Наследование от OrderedDict, как и в ответе, с которым вы связаны, является самым простым способом. Больше работы для реализации упорядоченного хранилища, чем для получения значений по умолчанию из функции factory.

Все, что вам нужно реализовать для defaultdict, - это бит пользовательской логики __init__ и чрезвычайно простой __missing__.

Если вы вместо этого наследуете от defaultdict, вам необходимо делегировать или повторно реализовать не менее __setitem__, __delitem__ и __iter__ для воспроизведения операции в порядке. Вам все равно придется выполнять настройку в __init__, хотя вы можете унаследовать или просто отказаться от некоторых других методов в зависимости от ваших потребностей.

Посмотрите оригинальный рецепт или любой из других, связанных с другим стеком Вопрос переполнения, что бы это повлекло за собой.

Ответ 2

Я нашел способ подклассировать их обоих, но не уверен, есть ли ошибки:

class OrderedDefaultDict(defaultdict, OrderedDict):
    def __init__(self, default, *args, **kwargs):
        defaultdict.__init__(self, default)
        OrderedDict.__init__(self, *args, **kwargs)