Как перенести Python dict?

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

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

8
задан Chris R 2 August 2010 в 05:35
поделиться

3 ответа

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

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

__len__
__iter__
__getitem__

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

__contains__

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

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

__setitem__
__delitem__    
13
ответ дан 5 December 2019 в 10:00
поделиться

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

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

3
ответ дан 5 December 2019 в 10:00
поделиться

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

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

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

В Python docs есть списки элементов, где можно найти методы и примеры использования.

1
ответ дан 5 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: