Вызов значений из словаря Python: методы .get() и .setdefault() вместо квадратных скобок
Вы всё ещё пользуетесь квадратными скобками? Тогда мы идём к вам.


Dana Moskvina / Skillbox Media
Словарь в Python — это набор из пар «ключ: значение». Основные его свойства:
- В каждой паре ключ (key) указывает на значение (value).
- Ключи уникальны, повторов нет. Значения могут быть одинаковыми.
- В отличие от списка или кортежа, словарь не упорядочен, то есть нельзя указать, какая пара в нём идёт первой, а какая последней.
Ключ от значения отделяется двоеточием, а пары разделяются запятыми. Весь словарь заключён в фигурные скобки {}.
author = {
"first_name": "Виктор",
"last_name": "Пелевин",
"username": "dao1962"
}
В качестве ключей можно использовать строки, числа (целые и дробные), кортежи. Нельзя использовать списки, словари и другие изменяемые типы данных. В качестве значений можно использовать любой тип данных.
Работа со словарём подразумевает вызов хранимых в нём значений по ключу. И здесь есть несколько способов.

Обычный (не слишком хороший) способ
Первый способ, который узнают начинающие питонисты, — это вызов значений с помощью квадратных скобок. Пишется имя словаря, а за ним в квадратных скобках идёт ключ. Если Python находит такой ключ в словаре, то возвращает соответствующее ему значение.
author = {
"first_name": "Виктор",
"last_name": "Пелевин",
"username": "dao1962"
}
author['username']
>>> 'dao1962'
author['age']
>>> Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
author['age']
KeyError: 'age'
Если же такого ключа нет, то вернётся исключение KeyError. И это, надо сказать, довольно неприятно, особенно в случае с объёмными и часто изменяющимися данными.
Путей решения этой проблемы несколько:
- Использовать конструкцию try / except (схожую с условным оператором if / else), которая будет обрабатывать KeyError и возвращать не само исключение, а что-то более удобное для работы — например, сообщение.
try:
author['age']
except KeyError:
print('Такого ключа нет')
>>> 'Такого ключа нет'
- Использовать встроенную библиотеку collections, а конкретно структуру defaultdict из неё — расширение над обычным словарём, позволяющее устанавливать значения по умолчанию для запрошенных несуществующих ключей.
Но есть и третий способ, даже два. Словарь в Python поддерживает встроенные методы вызова значения .get() и .setdefault(), которые позволяют обойтись без обработки исключений и импорта библиотек. Их мы и рассмотрим.
Вызов с помощью .get()
Пожалуй, самый безопасный способ вызова значений из словаря. У него два параметра:
- Первый (обязательный) — ключ, значение которого мы хотим вызвать.
- Второй (опциональный) — значение, которое вернёт метод, если ключа в словаре не существует. По умолчанию оно равно None — его метод и вернёт.
author.get('first_name')
>>> 'Виктор'
author.get('age') # ничего не происходит
print(author.get('age')) # поэтому используем print
>>> None
author.get('age', 'Такого ключа в словаре нет')
>>> 'Такого ключа в словаре нет'
Если ключ в словаре существует, то вызов .get() ничем не отличается от вызова с помощью квадратных скобок. Если же ключа нет, то метод возвращает второй параметр — либо None, либо, например, строку с сообщением.
И не надо обрабатывать ошибки и исключения.
Вызов с помощью .setdefault()
Иногда может понадобиться не только защита от ошибки KeyError, но и исправление самого словаря. Для этого применяется метод .setdefault(), который по синтаксису и выводу похож на .get() и принимает те же два параметра: вызываемый ключ и его значение по умолчанию.
Обнаружив, что вызываемого ключа не существует, метод .setdefault():
- сам создаёт ключ;
- создаёт к нему в пару значение, заданное вами (по умолчанию — None);
- добавляет получившуюся пару в словарь;
- возвращает значение.
Если вы не указали второй параметр, он вернёт None, то есть ничего.
author.setdefault('middle_name') # None - значит ничего
author # добавился ключ 'middle_name' со значением None
>>> {
'first_name': 'Виктор',
'last_name': 'Пелевин',
'username': 'dao1962',
'middle_name': None,
}
author.setdefault('book', 'Омон Ра')
>>> 'Омон Ра'
author
>>> {
'first_name': 'Виктор',
'last_name': 'Пелевин',
'username': 'dao1962',
'middle_name': None,
'book': 'Омон Ра',
}
Обратите внимание, что этот метод не меняет значения у существующих ключей.
author.setdefault('first_name', 'Владимир')
>>> 'Виктор'
Что в итоге
Если вам не нужно изменять сам словарь, то пользуйтесь вызовом с помощью .get(). Если запрашиваемые ключи и значения отсутствуют в словаре и их нужно туда добавить, то подойдёт метод .setdefault(). Оба этих метода надёжнее, чем «школьный» вызов с помощью квадратных скобок.
Хотите узнать больше? На курсе «Профессия Python-разработчик» вы познакомитесь со всеми методами и инструментами Python, которые необходимы программисту для успешного трудоустройства. Приходите!