наследование от OrderedDict и defaultdict - PullRequest
11 голосов
/ 31 марта 2012

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

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.

Я нашел хорошее решение здесь: https://stackoverflow.com/a/4127426/336527, но я думал, что, возможно, вывод из defaultdict может сделать это еще проще?

Ответы [ 2 ]

7 голосов
/ 31 марта 2012

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

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

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

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

3 голосов
/ 03 сентября 2013

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

class OrderedDefaultDict(defaultdict, OrderedDict):
    def __init__(self, default, *args, **kwargs):
        defaultdict.__init__(self, default)
        OrderedDict.__init__(self, *args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...