具有固定和有序键的可变字典

Jir*_*iri 5 python dictionary

我正在使用 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.MutableMappingcollections.abc.MutableMapping3.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)