Python字典强制执行单一分配

kab*_*nus 0 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'
Run Code Online (Sandbox Code Playgroud)

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

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

注意

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

jde*_*esa 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'
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)