Проверка if gen не проверяет наличие совпадений, а gen[0] вызывает TypeError. Исправьте поиск через next(..., None) и используйте неизменяемый аргумент по умолчанию.
Поиск первого объекта, соответствующего условию
Проверка if gen не проверяет наличие совпадений, а gen[0] вызывает TypeError. Исправьте поиск через next(..., None) и используйте неизменяемый аргумент по умолчанию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Провести ревью кода: оценить правильность реализованной логики и убедиться в безопасном использовании генераторов и параметров со значениями по умолчанию.
def get_first_matching_object(condition, items=[]):
gen = (elem for elem in items if condition(elem))
if gen:
result = gen[0]
return result
else:
return None
Ответ
Проверка if gen не проверяет наличие совпадений, а gen[0] вызывает TypeError. Исправьте поиск через next(..., None) и используйте неизменяемый аргумент по умолчанию.
Корректный однопроходный вариант:
def get_first_matching_object(condition, items=()):
return next((item for item in items if condition(item)), None)
Он возвращает первый подходящий объект и не просматривает остаток после успеха. Для пустого входа или отсутствия совпадений вернётся None. Исключения самой condition не скрываются. Общий default-список в исходнике пока не мутируется, но () лучше отражает отсутствие необходимости менять вход и защищает от случайной последующей модификации.