代码之家  ›  专栏  ›  技术社区  ›  Chris R

如何包装python dict?

  •  8
  • Chris R  · 技术社区  · 15 年前

    --不是子类--python dict 对象,以便在后台存储中检测到更改时,我可以重新创建委派的dict对象。我打算在每次访问dict进行读取时检查后备存储中的更改。

    假设我要创造一个这样的物体;我需要实现什么方法?

    3 回复  |  直到 15 年前
        1
  •  13
  •   Alex Martelli    15 年前

    可以将 ABC (抽象基类) collections.Mapping collections.MutableMapping 如果您还希望允许使用实例的代码更改模拟/包装的字典,例如通过索引赋值, pop 等)。

    如果您这样做了,那么,正如我指出的文档间接暗示的那样,您需要实现的方法是

    __len__
    __iter__
    __getitem__
    

    (对于 Mapping )——你 应该 同时实施

    __contains__
    

    因为通过授权给你正在包装的dict,它可以比ABC必须应用的迭代方法快得多。

    如果你需要提供 MutableMapping

    __setitem__
    __delitem__    
    
        2
  •  3
  •   Seth    15 年前

    除了已经提出的建议之外,您可能还想看看 UserDict .

    例如,类似dict的对象,可以通过django的 session implementation ,特别是 SessionBase

        3
  •  1
  •   kerkeslager    15 年前

    我想这取决于你用什么方法。可能 __getitem__ , __setitem__ , __iter__ __len__ __iter公司__

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

    …如果在每次迭代中命中数据源,速度会很慢,更不用说,如果数据源从您下面更改,它甚至可能不起作用。所以您可能需要在那里抛出某种异常并实现 iteritems

    这个 Python docs 有项目列表,您可以在其中查找方法和用例。