Подклассы из 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)