我非常希望在Python中拥有一次写入字典对象,以便:
my_dict[1] = 'foo'
my_dict[2] = 'bar'
my_dict[1] = 'baz' # Raises KeyError
我可以想象做一个直截了当的,但我想知道是否存在一个更好的思路?我找不到一个。
答案 0 :(得分:13)
实现子类很容易:
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__
调用方面为您实现了大多数方法:< / p>
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__
一样简单。