11

Почему использовать dict.get(key) вместо dict[key]?

16

У меня возник вопрос по поводу метода get для объектов dict в Python, который, получая ключ в словаре, возвращает связанное с ним значение.

Какова полезность этой функции? Если я хочу найти значение, связанное с ключом в словаре, я могу просто использовать dict[key], и это вернет то же самое:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"] == dictionary.get("Name")  # True

Почему стоит использовать метод get, если в большинстве случаев достаточно просто обращения к элементу по ключу?

5 ответ(ов)

16

Метод get позволяет вам указать значение по умолчанию, если ключ отсутствует в словаре:

dictionary.get("bogus", default_value)

вернёт default_value (каким бы вы его ни задали), в то время как

dictionary["bogus"]

вызовет ошибку KeyError.

Если не указать значение по умолчанию, то оно будет равно None, так что

dictionary.get("bogus")  # <-- Значение по умолчанию не указано -- по умолчанию None

вернёт None, так же как и

dictionary.get("bogus", None)

будет делать.

0

Метод get в Python принимает второй необязательный параметр. Если указанный ключ отсутствует в вашем словаре, то будет возвращено это значение.

dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'Нет данных')
>> 'Нет данных'

Если вы не передадите второй параметр, то будет возвращено значение None по умолчанию.

Если же вы используете индексирование, как в dictionary['Year'], то при отсутствии ключа будет вызвано исключение KeyError.

0

Вопрос, на который стоит обратить внимание при использовании метода .get():

Если в словаре присутствует ключ, который используется в вызове .get(), и его значение равно None, метод .get() вернет None, даже если было задано значение по умолчанию.

Например, следующий код вернет None, а не 'alt_value', как можно было бы ожидать:

d = {'key': None}
assert None is d.get('key', 'alt_value')

Следует помнить, что второе значение метода .get() возвращается только в том случае, если указанный ключ отсутствует в словаре, а не если возвращаемое значение этого вызова уже равно None.

0

Я приведу практический пример сбора данных с веб-сайтов с использованием Python. Часто вы столкнетесь с ситуацией, когда ключи словаря не имеют значений. В таких случаях, если вы используете dictionary['key'], это приведет к ошибке, тогда как dictionary.get('key', 'return_otherwise') работает без проблем.

Аналогично, я бы использовал ''.join(list) вместо list[0], если вам нужно получить единственное значение из списка.

Надеюсь, это поможет.

[Редактировать] Вот практический пример:

Предположим, вы вызываете API, который возвращает JSON-файл, который вам нужно разобрать. Первый JSON выглядит следующим образом:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}

Второй JSON выглядит так:

{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}

Обратите внимание, что во втором JSON отсутствует ключ "submitdate_ts", что довольно нормально для любой структуры данных.

Таким образом, когда вы пытаетесь получить значение этого ключа в цикле, можно ли использовать следующее:

for item in API_call:
    submitdate_ts = item["bids"]["submitdate_ts"]

Вы можете это сделать, но это вызовет ошибку трассировки для второй строки JSON, потому что ключ просто не существует.

Подходящий способ записи этого кода может выглядеть так:

for item in API_call:
    submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")

{'x': None} используется для предотвращения ошибки на втором уровне. Конечно, вы можете добавить больше отказоустойчивости в код, если занимаетесь сбором данных. Например, сначала указать условие if.

0

Цель использования метода get в словаре заключается в том, чтобы вернуть значение по указанному ключу, а в случае его отсутствия предоставить значение по умолчанию. Это очень удобно, поскольку позволяет избежать ошибки KeyError, если ключ не найден. В вашем примере:

dictionary.get("Name", 'harry')

если ключ "Name" отсутствует в словаре dictionary, метод вернёт 'harry', что позволяет избежать необходимости предварительной проверки наличия ключа.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь