2014-02-06 105 views
2

我很喜欢在Python中的一次写入字典对象,因此:一次写字典?

my_dict[1] = 'foo' 
my_dict[2] = 'bar' 
my_dict[1] = 'baz' # Raises KeyError 

我能想象做一个简单的一个,但我不知道如果有更好的深思熟虑的食谱存在?我找不到一个。

+2

我不知道任何支持该用例。很简单,可以将'dict'子类化并实现它。 –

回答

12

这是很容易实现的子类:

class WriteOnceDict(dict): 
    def __setitem__(self, key, value): 
     if key in self: 
      raise KeyError('{} has already been set'.format(key)) 
     super(WriteOnceDict, self).__setitem__(key, value) 

你也可以提供自定义update()方法,并根据你想如何严格的是,__delitem__()pop()popitem()clear()可能需要重写过。

为超级严格的版本,它更容易在collections.MutableMapping()混合,因为它实现了大多数方法为你的__getitem____setitem____delitem__通话方面:

from collections import MutableMapping 

class StrictWriteOnceDict(MutableMapping, dict): 
    # dict implementations to override the MutableMapping versions 
    __getitem__ = dict.__getitem__ 
    __iter__ = dict.__iter__ 

    def __delitem__(self, key): 
     raise KeyError('Read-only dictionary') 

    def __setitem__(self, key, value): 
     if key in self: 
      raise KeyError('{} has already been set'.format(key)) 
     dict.__setitem__(self, key, value) 

允许删除是因为更换__delitem__一样简单方法与__delitem__ = dict.__delitem__

+1

您可能不需要自定义'setdefault',因为它永远不会覆盖条目。 – user2357112

+1

@ user2357112:好点。 –