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

2024-05-19 09:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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

有人建议我查找名为FrozenDict的解决方案,但它使dict变为只读-无法修改值(分配新值时引发异常)。这不是我想要的。在


Tags: 数据示例字典图书馆initexception密钥建议
2条回答

您需要一个dict的子类,它允许您在某个点冻结键,但允许值发生变化?这一个允许你冻结填充后的关键点,以允许更大的灵活性。在

from collections import OrderedDict

class FreezableDict(OrderedDict):
    def __init__(self, *args, **kw):
        super(OrderedDict, self).__init__(*args, **kw)
        self._frozen = False
    def __setitem__(self, key, value):
        if key not in self and self._frozen:
            raise TypeError("No key additions once a FreezableDict is frozen!")
        return super(OrderedDict, self).__setitem__(key, value)
    def freeze(self):
        self._frozen = True

d = FreezableDict((("A", 1), ("B", 2)))

print d["A"]
d["C"] = "New Value"
d.freeze()
d["C"] = "Replacement"
print d["C"]
d["D"] = "This raises a TypeError exception"

但是要注意,并不是所有的方法都被包装在这里,它也没有试图成为OrderedDict的完全模拟——代码假设所有继承的方法都将正确运行。例如,即使在冻结之后,当前仍然允许删除项。在

我不知道在标准库中有这样的解决方案(这是一个相当专业的用例)。但是,您可以使用^{}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)

相关问题 更多 >

    热门问题