Есть ли способ обновить значение словаря Python, но не добавлять ключ, если он не существует?

#python #python-3.x #dictionary

#python #python-3.x #словарь

Вопрос:

У меня есть словарь как таковой:

 d = {'a': 1, 'b': 2, 'c': 3}
 

Я хочу обновить значение key 'c' и могу сделать это с d['c'] = 30 помощью .

Поведение, которое я хочу, — это иметь возможность обновлять только существующие ключи, а не добавлять новые ключи. Если я попытаюсь это сделать d['e'] = 4 , я бы хотел, чтобы он выдавал какое-то исключение вместо поведения по умолчанию, которое заключается в создании нового ключа 'e' со значением 4 .

Есть ли функция, которая выполняет такое поведение? Я знаю, что могу понять, чтобы сначала проверить if 'e' in d , но опять же, проверяя, есть ли встроенный.

Комментарии:

1. вероятно, лучше не использовать словарь

2. Вы можете создать свой собственный класс словаря или создать для этого функцию, например def add_only(dictionary, key, value)

3. Это не проверка во время выполнения, но ваш сценарий может быть лучше покрыт typing.TypedDict статической проверкой, а не проверкой во время выполнения. Или для ограничений времени выполнения, используя простой __slots__ класс (и / или простой dataclasses.dataclass ) и используя синтаксис атрибута, а не dict стиль подписки.

Ответ №1:

Я не знаю о таком встроенном поведении, но вы всегда можете реализовать свой собственный dict:

 class no_new_dict(dict):
    def __setitem__(self, key, value):
        if key in self:
            super().__setitem__(key, value)
        else:
            raise KeyError(key)

d = no_new_dict({'a': 1, 'b': 2, 'c': 3})
print(d)
d['c'] = 20
print(d)
d['d'] = 20
 

Вывод приведенного выше фрагмента будет:

 {'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 20}
Traceback (most recent call last):
  File "C:UserstomerkPycharmProjectspythonProjecttest.py", line 12, in <module>
    d['d'] = 20
  File "C:UserstomerkPycharmProjectspythonProjecttest.py", line 6, in __setitem__
    raise KeyError(key)
KeyError: 'd'