我正在使用 OrderedDict 来存储一些重要数据。我想确保,意外插入此字典的新键会引发异常,但我希望 dict 是可变的。我希望修复密钥(在创建之后__init__
)。是否可以通过一些图书馆课程来做到这一点?或者我是否必须以某种方式为此实现新的有序类?
例子:
d = FixedOrderedDict( ( ("A", 1), ("B", 2) ) )
print d["A"]
# 1
d["A"] = 11
print d["A"]
# 11
d["C"] = 33
# throws exception
Run Code Online (Sandbox Code Playgroud)
建议我查找名为FrozenDict的解决方案,但它使 dict 成为只读 - 值无法修改(分配新值时抛出异常)。这不是我想要达到的目标。
小智 4
我不知道标准库中有这样的解决方案(这是一个相当专业的用例)。但是,您可以使用collections.MutableMapping
(collections.abc.MutableMapping
3.3 及更高版本中)免费获得大部分功能。给出或采取一些我现在可能忽略的小问题,这只是:
from collections import MutableMapping, OrderedDict
class FixedOrderedDict(MutableMapping):
def __init__(self, *args):
self._d = OrderedDict(*args)
def __getitem__(self, key):
return self._d[key]
def __setitem__(self, key, value):
if key not in self._d:
raise KeyError("Must not add new keys")
self._d[key] = value
def __delitem__(self, key):
raise NotImplementedError("Must not remove keys")
def __iter__(self):
return iter(self._d)
def __len__(self):
return len(self._d)
Run Code Online (Sandbox Code Playgroud)