Python:测试字典(dict)条目是否已被修改

时间:2011-03-25 10:25:29

标签: python dictionary wrapper

我为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 个答案:

答案 0 :(得分:1)

我认为您可以覆盖__setitem__()方法以跟踪值的更改,将更改的值存储在列表中,并使用此列表选择要写出的正确值。

答案 1 :(得分:1)

我可能会使用某种发布 - 订阅模型来处理它,其中包含的字典订阅每个子字典(或其他值)。然后,当编辑其中一个时,它会通知任何包含它的字典。

如果你不希望它们全部处理那些并且愿意允许包含字典只检查访问的变化或按设定的间隔,你可以让每个包含的对象跟踪{{1数字。然后,当包含字典准备就绪时,它只是检查该版本号是否已更改。

最后一种可能性是有一种方法可靠地计算所包含对象的哈希值。这可以让你编写一个外部函数,并且不需要对象跟踪它们自己的版本,但是它有自己的复杂性,因为你需要在所有这些函数上重载version或者编写另一种形式的{ {1}}可以识别对象并从中获取某种智能哈希值的函数

答案 2 :(得分:0)

您可以存储每个值的两个副本:原始状态和可能已修改的状态。然后,只需将这些与!=进行比较,即可选择要写出来的内容。

答案 3 :(得分:0)

内存允许,您可以保留从磁盘读取的原始值的副本,并在close()方法中将当前值与原始值进行比较,只记录更改。

这种方法可以更自由地放入字典中,因为元素不需要跟踪对它们所做的更改。