Python: проверить, была ли изменена запись словаря (dict) - PullRequest
3 голосов
/ 25 марта 2011

Я написал небольшую оболочку для встроенного класса dict, который загружает записи (значения) словаря из файлов cPickle d при первом обращении к соответствующему ключу.Когда словарь уничтожен, все загруженные записи записываются обратно на диск.

Теперь было бы удобно, если бы я мог проверить, было ли изменено какое-либо из значений, и выписать только те, которые фактически были. Поэтому мой вопрос: знает ли словарь, изменилось ли значение?Или есть разумный способ прозрачно реализовать это?

Для полноты я прилагаю код, который я использую.Он вызывается с путем, в котором хранятся файлы (ключи используются в качестве имен файлов) и со списком ключей, для которых существуют файлы.

import cPickle

class DictDB(dict):

  def __init__(self, path, folders):
    self.picklepath     = path    # path to files on disk
    self.folders        = folders # available folders
    self.loaded_folders = {}

  def has_key(self, key):
    return key in self.folders

  def get(self, key):
    if not key in self.loaded_folders.keys():
      if not key in self.folders:
        raise KeyError("Folder "+key+" not available")
      # load from disk
      self.loaded_folders[key] = cPickle.load(file(self.picklepath + key + ".cpickle2"))
    return self.loaded_folders[key]

  def __getitem__(self, key):
    return self.get(key)

  def close(self):
    for folder in self.loaded_folders.keys():
      # write back
      cPickle.dump(self.loaded_folders[folder], file(picklepath + folder + '.cpickle2', 'w'), 2)

  def __del__(self):
    self.close()

Ответы [ 4 ]

1 голос
/ 26 марта 2011

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

Если вы не хотите, чтобы все они имели дело с проводкой для этого, и хотите, чтобы содержащийся словарь проверял только изменения при доступе или с заданными интервалами, вы можете заставить каждый содержащийся объект отслеживать version число. Затем, когда содержащийся словарь готов, он просто проверяет, изменился ли этот номер версии.

Окончательная возможность будет иметь способ надежного вычисления значений хеш-функции для содержащихся объектов на месте. Это позволило бы вам написать внешнюю функцию и избавить объекты от необходимости отслеживать их собственные версии, но имеет свои собственные сложности, поскольку вам нужно либо перегрузить <code>__hash__ на всех них, либо написать другую форму hash() функция, которая может идентифицировать объект и извлечь из него некое интеллектуальное хешированное значение

1 голос
/ 25 марта 2011

Я думаю, что вы можете перезаписать метод __setitem__(), чтобы отслеживать изменения значений, сохранять измененные значения в списке и использовать этот список, чтобы выбрать правильные значения для записи.

0 голосов
/ 25 марта 2011

Если позволяет память, вы можете сохранить копию исходных значений, считанных с диска, и в методе close() сравнить текущие значения с исходными значениями, записав только изменения.

Этот метод дает больше свободы в том, что можно поместить в словарь, поскольку элементам не нужно отслеживать изменения, внесенные в них.

0 голосов
/ 25 марта 2011

Вы можете хранить две копии каждого значения: исходное состояние и, возможно, измененное состояние. Затем просто сравните их с !=, чтобы выбрать, что выписать.

...