Генератор всегда проходит проверку if candidates, но не поддерживает candidates[0]. Используйте next(candidates, None); вместо общего изменяемого списка задайте пустой кортеж по умолчанию.
Нахождение первого элемента, удовлетворяющего условию
Генератор всегда проходит проверку if candidates, но не поддерживает candidates[0]. Используйте next(candidates, None); вместо общего изменяемого списка задайте пустой кортеж по умолчанию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Код‑ревью. Оценить корректность реализации, безопасность использования генераторов и потенциальные проблемы с изменяемыми аргументами по умолчанию.
def get_first_matching_object(cond, items=[]):
candidates = (obj for obj in items if cond(obj))
if candidates:
result = candidates[0]
return result
else:
return None
Ответ
Генератор всегда проходит проверку if candidates, но не поддерживает candidates[0]. Используйте next(candidates, None); вместо общего изменяемого списка задайте пустой кортеж по умолчанию.
Исправленная функция лениво ищет первое совпадение:
def get_first_matching_object(cond, items=()):
return next((obj for obj in items if cond(obj)), None)
Если подходящего элемента нет, возвращается None, а после первого совпадения дальнейшие элементы не проверяются. В исходнике ошибка возникает ещё до поиска: индексирование генератора вызывает TypeError. Если None сам может быть допустимым результатом, для различения «найден None» и «не найдено» потребуется отдельный sentinel или другой контракт результата.