我很喜歡在Python中的一次寫入字典對象,因此:一次寫字典?
my_dict[1] = 'foo'
my_dict[2] = 'bar'
my_dict[1] = 'baz' # Raises KeyError
我能想象做一個簡單的一個,但我不知道如果有更好的深思熟慮的食譜存在?我找不到一個。
我很喜歡在Python中的一次寫入字典對象,因此:一次寫字典?
my_dict[1] = 'foo'
my_dict[2] = 'bar'
my_dict[1] = 'baz' # Raises KeyError
我能想象做一個簡單的一個,但我不知道如果有更好的深思熟慮的食譜存在?我找不到一個。
這是很容易實現的子類:
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__
。
您可能不需要自定義'setdefault',因爲它永遠不會覆蓋條目。 – user2357112
@ user2357112:好點。 –
我不知道任何支持該用例。很簡單,可以將'dict'子類化並實現它。 –