В общих чертах (не обязательно 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 (где это возможно), а не что-то вроде получения списка ключей с последующей обработкой их с помощью отдельных операторов.