Python字典强制执行单一作业

时间:2017-05-18 15:36:47

标签: python dictionary

我正在寻找优雅的解决方案:

x = {}
x['key'] = 'something'
...
...
for i in someKeyList:
    if i in x: raise KeyError('Enforcing single assign') #Happens for i == 'key' for example
    x[i] = 'else'

基本上我想要一个字典,其中分配给现有密钥会引发错误。我目前实现了UserDict,但这些比内置版慢。但我正在寻找内置或至少在常见模块中的东西。

XY:这是对存在的哈希检查,我需要O(1)查找和插入。

注意

我想要的词典是不可变(是可变的......)。您可以添加,删除或执行任何操作。唯一的区别是为现有值赋值会引发错误。

1 个答案:

答案 0 :(得分:6)

如果需要,您可以直接继承dict而不是UserDict

class SingleAssignDict(dict):
    def __init__(self, *args, **kwargs):
        super(SingleAssignDict, self).__init__(*args, **kwargs)
    def __setitem__(self, key, value):
        if dict.__contains__(self, key):
            raise KeyError('Enforcing single assign')
        dict.__setitem__(self, key, value)

x = SingleAssignDict()
x['a'] = 1
x['a'] = 1
>>> KeyError: 'Enforcing single assign'

另一种选择是使用dict.setdefault,但这只会忽略重复的赋值而不是抛出异常。如果保证您的'else'值不存在任何dict密钥,则可以执行以下操作:

x = {}
x['key'] = 'something'
...
...
for i in someKeyList:
    if x.setdefault(i, 'else') != 'else':
        raise KeyError('Enforcing single assign')