Как назвать метод, который возвращает один объект или None и обрабатывает исключения при отсутствии или множестве объектов
Что проверяют
Знаете ли вы устоявшиеся соглашения об именах, по которым читатель кода угадывает поведение, не открывая тело метода. Второй слой: как метод сообщает о разных исходах. Следом обычно спрашивают, почему «ничего не нашлось» и «нашлось два» нельзя обрабатывать одинаково.
Как отвечать
Сильный ответ опирается на готовый прецедент: в SQLAlchemy ровно такой метод называется one_or_none(). Там же видна вся семья, которую стоит перечислить:
one(): ровно одна строка, иначеNoResultFoundилиMultipleResultsFound;one_or_none():None, если пусто, иMultipleResultsFound, если строк больше одной;first(): первая строка илиNone, остальные молча отбрасываются.
В Django похожая пара: get() бросает DoesNotExist и MultipleObjectsReturned, а first() возвращает None. Встроенного get_or_none там нет, его обычно пишут в своём менеджере. Для обычных итерируемых объектов есть more_itertools.only().
Отсюда своё имя: get_one_or_none() или find_one(), если в проекте принято, что get_ бросает исключение при отсутствии, а find_ возвращает None. Главное, чтобы соглашение было одним на весь код. Сигнатура тоже документирует поведение: def get_one_or_none(self, **filters) -> User | None.
Реализация: запросите не больше двух записей (LIMIT 2), этого достаточно, чтобы отличить «одна» от «много», не загружая всю выборку. Ноль записей даёт None, две бросают собственное исключение, например MultipleObjectsFound(LookupError), с фильтрами в тексте сообщения.
Где спотыкаются
Оборачивают тело в try с except Exception и print. Тогда собственное исключение о дубликатах тут же ловится, и метод возвращает None там, где в данных ошибка.
Возвращают None и при пустом результате, и при дубликатах. Вызывающий код не отличит «пользователя нет» от «в базе два пользователя с одинаковым email».
Называют метод get_user() без намёка на None, и через месяц кто-то обращается к атрибуту результата без проверки и получает AttributeError.