锁定自定义词典

时间:2009-08-11 14:16:09

标签: python dictionary locking

美好的一天蟒蛇,

我想制作一个包含两个主要功能的自定义词典:

  1. 所有密钥都在创建时声明
  2. 无法添加新密钥或修改当前密钥(值仍可修改)
  3. 现在代码就是这样:

    class pick(dict):
       """This will make delicious toffee when finished"""
       def __init__(self, *args):
           dict.__init__(self)
           for arg in args:
               self[arg] = None
    

    非常感谢任何帮助。

    UPD:

    虽然我正在寻找解决方案但有一个问题:

    字典调用__setitem__在初始化时添加项目,而不是找到引发错误的键。

    cupboard = pick('milk')  #raises error
    

    upd1:

    全部解决了,非常感谢。

3 个答案:

答案 0 :(得分:12)

使用您想要的行为覆盖__setitem__方法,调用dict.__setitem__(self, key, value)以修改基本字典,而无需通过基本逻辑。

class ImmutableDict(dict):
    def __setitem__(self, key, value):
        if key not in self:
             raise KeyError("Immutable dict")
        dict.__setitem__(self, key, value)

d = ImmutableDict(foo=1, bar=2)
d['foo'] = 3
print(d)
d['baz'] = 4 # Raises error

您还需要覆盖dict.update()setdefault()以避免添加密钥。可能dict.__delitem__()dict.clear()dict.pop()dict.popitem()以避免删除密钥。

答案 1 :(得分:2)

这样的东西
class UniqueDict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)

    def __setitem__(self, name, value):
        if name not in self:
            raise KeyError("%s not present")
        dict.__setitem__(self, name, value)

答案 2 :(得分:2)

我建议您使用委托,而不是继承。 如果继承,dict的所有先前方法都将被继承,但它们可以按照您的预期行为,从而破坏您对类的假设,并以静默方式执行。

如果你做了委托,你可以完全控制你提供的方法,如果你试图在需要你没有实现的方法的上下文中使用你的dict,你将得到一个例外,快速解决问题。