Не используйте get. Вы могли бы сделать:
item = my_dict.get('john', default_value.copy())
Но для этого необходимо скопировать словарь , даже если запись словаря существует . Вместо этого попробуйте просто проверить, есть ли значение.
item = my_dict['john'] if 'john' in my_dict else default_value.copy()
Единственная проблема с этим состоит в том, что он выполнит два поиска для 'john' вместо одного. Если вы хотите использовать дополнительную строку (а значение «Нет» - это значение, которое вы не можете получить из словаря), вы можете сделать следующее:
item = my_dict.get('john')
if item is None:
item = default_value.copy()
РЕДАКТИРОВАТЬ: Я думал, что я сделаю некоторые сравнения скорости с timeit. Default_value и my_dict были глобальными. Я делал их каждый для обоих, если ключ был там, и если была мисс.
Использование исключений:
def my_dict_get():
try:
item = my_dict['key']
except KeyError:
item = default_value.copy()
# key present: 0.4179
# key absent: 3.3799
Использование get и проверка его на None.
def my_dict_get():
item = my_dict.get('key')
if item is None:
item = default_value.copy()
# key present: 0.57189
# key absent: 0.96691
Проверка его существования с помощью специального синтаксиса if / else
def my_dict_get():
item = my_dict['key'] if 'key' in my_dict else default_value.copy()
# key present: 0.39721
# key absent: 0.43474
Наивное копирование словаря.
def my_dict_get():
item = my_dict.get('key', default_value.copy())
# key present: 0.52303 (this may be lower than it should be as the dictionary I used was one element)
# key absent: 0.66045
По большей части все, кроме того, которое использует исключения, очень похоже. Кажется, что специальный синтаксис if / else имеет наименьшее время по какой-то причине (не знаю почему).