Как обернуть питона dict? - PullRequest
       2

Как обернуть питона dict?

8 голосов
/ 02 августа 2010

Я хочу реализовать класс, который будет оборачивать - не подкласс - объект python dict, чтобы при обнаружении изменения в резервном хранилище я мог заново создать делегированный dictобъект.Я намереваюсь проверять изменения в резервном хранилище каждый раз, когда к диктовке обращаются для чтения.

Предположим, я должен был создать объект, чтобы действовать так;какие методы мне нужно реализовать?

Ответы [ 3 ]

12 голосов
/ 02 августа 2010

Вы можете создать подкласс ABC (абстрактный базовый класс) collections.Mapping (или collections.MutableMapping), если вы также хотите разрешить коду, использующему ваши экземпляры, изменять симулированный / упакованный словарь, например, с помощью индексированного назначения,pop и т. Д.).

Если вы сделаете это, то, как я указывал в документах, косвенно, методы, которые вам нужно реализовать, являются

__len__
__iter__
__getitem__

(для Mapping) - вы должны также реализовать

__contains__

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

Если вам нужно указать MutableMapping, вам также нужно реализовать еще 2 метода:

__setitem__
__delitem__    
2 голосов
/ 02 августа 2010

В дополнение к тому, что уже было предложено, вы можете взглянуть на UserDict .

В качестве примера объекта, подобного dict, вы можете прочитать реализацию сеанса django , в частности класс SessionBase.

1 голос
/ 02 августа 2010

Я думаю, это зависит от того, какие методы вы используете. Вероятно, __getitem__, __setitem__, __iter__ и __len__, поскольку большинство вещей может быть реализовано в терминах тех. Но вы захотите взглянуть на некоторые варианты использования, особенно с __iter__. Как то так:

for key in wrapped_dictionary:
   do_something(wrapped_dictionary[key])

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

В Python документы есть списки предметов, в которых можно искать методы и варианты использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...