Генератор нельзя индексировать, его truthiness не проверяет наличие элементов, а predicate должен получать obj, не object. Проще вернуть первый подходящий элемент через next.
Провести код-ревью, найти все ошибки
Генератор нельзя индексировать, его truthiness не проверяет наличие элементов, а predicate должен получать obj, не object. Проще вернуть первый подходящий элемент через next.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Провести код-ревью, найти все ошибки
def get_first_matching_object(predicate, objects=[]): matching_objects = (obj for obj in objects if predicate(object)) if matching_objects: object = matching_objects[0] return object else: return None
Ответ
Генератор нельзя индексировать, его truthiness не проверяет наличие элементов, а predicate должен получать obj, не object. Проще вернуть первый подходящий элемент через next.
Исправление:
def get_first_matching_object(predicate, objects=()):
return next((obj for obj in objects if predicate(obj)), None)
В исходнике первой проявится ошибка индексирования генератора. Если начать его перебирать, обращение к локальному object до присваивания тоже ошибочно. Имя дополнительно затеняет встроенный тип.
Общий изменяемый default [] здесь прямо не модифицируется, но создаёт ненужный риск; пустой tuple его убирает. Поиск останавливается на первом совпадении, время O(n), дополнительная память O(1). Если найденный элемент сам None, для различения отсутствия используйте sentinel.