2014-02-06 67 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:好點。 –