448просмотров
83.0%от подписчиков
20 февраля 2026 г.
Score: 493
Сложно понять, что происходит в коде, когда в одной строке выполняется сразу много операций: и вызовы функций, и сложение, и вычитание, и сравнение. Приходится распутывать выражение, мысленно разбирая его на части. Код из нашего примера может выглядеть так:
image_links = response.json()['links']['flickr']['original']
for number, link in enumerate(image_links, start=1): ... Если ответ на запрос будет еще где-то использоваться, то его следует закэшировать: response = response.json()
image_links = response['links']['flickr']['original']
for number, link in enumerate(image_links, start=1): ... По поводу обработки корнер-кейса с отсутствием значений в словаре: если применить метод get(), то получится нечто страшночитаемое вроде:
image_links = data.get('links', {}).get('flickr', {}).get('original', 'default.jpg')
При этом смысла продолжать работу функции, когда не удалось добраться до значений нет никакого — странно итерировать по значениям по умолчанию и пытаться что-то считать. Поэтому лучше воспользоваться перехватом исключением:
try: image_links = response.json()['links']['flickr']['original']
except KeyError as exc: raise CustomException() from exc Итого — get() хорош, но все-таки когда одноуровневый словарь и есть реальное значение по умолчанию, которое можно и нужно использовать. Но ошибка то может быть не только из-за пустого словаря…😱
try: image_links = response.json()['links']['flickr']['original']
except (KeyError, json.JSONDecodeError, UnicodeDecodeError) as exc: raise CustomException() from exc Так что прикрутите Pydantic валидацию и выдохните! Спасибо большое, что активно писали в комменты и предлагали свои варианты!❤️