一次写字典?

时间:2014-02-06 11:26:04

标签: python

我非常希望在Python中拥有一次写入字典对象,以便:

my_dict[1] = 'foo'
my_dict[2] = 'bar'
my_dict[1] = 'baz'  # Raises KeyError

我可以想象做一个直截了当的,但我想知道是否存在一个更好的思路?我找不到一个。

1 个答案:

答案 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__一样简单。