我很喜欢在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'子类化并实现它。 –