Как назвать метод для получения заказа, который возвращает None если заказ не найден
Что проверяют
Умеете ли вы именем и сигнатурой сообщить вызывающему коду, чего ждать, если данных нет. Вопрос маленький, но за ним стоит контракт: вернуть None или бросить исключение. Следом обычно просят написать вторую версию метода.
Как отвечать
Дайте конкретное имя и опирайтесь на соглашения, которые все видели:
get_order(order_id) -> Order: в Python-экосистемеgetобычно значит «найдётся или исключение». Так ведут себяQuerySet.get()в Django сOrder.DoesNotExistиscalar_one()в SQLAlchemy;find_order(order_id) -> Order | None:findпринято читать как поиск, который может ничего не найти. Хороший основной вариант;get_order_or_none(order_id): длиннее, зато однозначно. Имя повторяет знакомыеone_or_none()иscalar_one_or_none()из SQLAlchemy, в Django-проектах так часто называют обёртку над.filter().first().
Важнее самого имени то, что его подкрепляет:
- аннотация:
-> Order | NoneилиOptional[Order]для версий до 3.10. С ней mypy и pyright заставят вызывающий код проверить результат; - пара методов:
find_orderтам, где отсутствие нормально, иget_orderс доменным исключениемOrderNotFoundтам, где заказ обязан быть. Сервисный слой не пишетif order is None: raiseв каждом месте; - единообразие: в одном репозитории все методы, возвращающие
None, названы по одному шаблону.
Закончите тем, какое соглашение выбрали бы в команде, и что договориться важнее, чем найти идеальное слово.
Где спотыкаются
Называют метод get_order и молча возвращают None. Вызывающий код этого не ждёт и через три вызова падает с AttributeError на NoneType, далеко от настоящей причины.
Вместо None возвращают False, пустой словарь или -1. Тип результата расползается, аннотация врёт.
Проверяют результат через if not order:. Если у модели определены __bool__ или __len__, существующий, но «пустой» объект пройдёт как ненайденный. Надёжнее if order is None.