我正在寻找优雅的解决方案:
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)查找和插入。
注意
我想要的词典是不可变(是可变的......)。您可以添加,删除或执行任何操作。唯一的区别是为现有值赋值会引发错误。
答案 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')