В общих чертах (не обязательно Python), я предпочитаю метод «попробуй тогда скажи-мне-если-он-пошел-неправильно» (исключения) во всех, кроме самых простых случаев. Это связано с тем, что в поточных средах или во время доступа к базе данных базовые данные могут изменяться между проверкой ключа и извлечением значения.
Если вы не изменяете ассоциативный массив вне текущего потока, вы можете выполнить метод «check-first-then-extract».
Но это для общего случая. Здесь, в частности, вы можете использовать get
метод, который позволяет указать значение по умолчанию, если ключ не существует:
return d.get (c, "N/A")
Я поясню, что я говорил в первом пункте.В ситуациях, когда базовые данные могут меняться между проверкой и использованием, вы должны всегда использовать операцию типа исключения (если у вас нет операции, которая не вызовет проблемы, например, d.get()
, упомянутой выше). Рассмотрим, например, следующие две нити временные линии:
+------------------------------+--------------------+
| Thread1 | Thread2 |
+------------------------------+--------------------+
| Check is NY exists as a key. | |
| | Delete NY key/val. |
| Extract value for NY. | |
+------------------------------+--------------------+
Когда нить 1 попытки извлечь значение, он получит исключение в любом случае, так что вы можете также просто код возможности и удалить первоначальную проверку.
Замечание о базах данных также актуально, так как это другая ситуация, когда базовые данные могут измениться. Вот почему я предпочитаю атомный SQL (где это возможно), а не что-то вроде получения списка ключей, а затем обработки их с помощью отдельных операторов.
исключая: - плохая карма. Всегда будьте конкретны в том, что вы заинтересованы в ловле, в этом случае KeyError – richo
Вы выбрали плохой пример. Очевидный ответ не предполагает ни стиля. – Omnifarious