我正在寻找优雅的解决方案:
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'
Run Code Online (Sandbox Code Playgroud)
基本上我想要一个字典,其中分配给现有密钥会引发错误.我目前实现了一个UserDict
,但这些比内置的慢.但我正在寻找内置或至少在常见模块中的东西.
XY:这是对存在的哈希检查,我需要O(1)查找和插入.
注意
我想要的字典不是一成不变的(是可变的......).您可以添加,删除或执行任何操作.唯一的区别是为现有值赋值会引发错误.
你可以直接子类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'
Run Code Online (Sandbox Code Playgroud)
另外一种选择是使用dict.setdefault
,尽管这只会忽略重复的赋值而不是抛出异常.如果'else'
保证您的值不存在任何dict键,您可以这样做:
x = {}
x['key'] = 'something'
...
...
for i in someKeyList:
if x.setdefault(i, 'else') != 'else':
raise KeyError('Enforcing single assign')
Run Code Online (Sandbox Code Playgroud)