Ревью кода и его оптимизация

Функция фактически генератор и выполняет два HTTP-запроса на URL. Свойство content_obj создаёт запись с побочными эффектами и возвращает None при лимите.

Короткий ответ

Что ответить на собеседовании

Функция фактически генератор и выполняет два HTTP-запроса на URL. Свойство content_obj создаёт запись с побочными эффектами и возвращает None при лимите.

Подробный разбор

Ответ с пояснениями

Условие

Требуется выполнить проверку качества и улучшить структуру следующего фрагмента кода.

from urllib.request import urlopen
from models import ContentObject, db
import logging
logger = logging.getLogger(__name__)

class GetHTTPContent:
    def __init__(self, target_urls=['https://buddy.ai']):
        self._urls = target_urls

    def get_content(self) -> list[str]:
        for url in self._urls:
            data = urlopen(url).read()
            obj = self.content_obj
            obj.content = data
            db.session.add(obj)
            db.session.commit()
            yield urlopen(url).read()

    @property
    def content_obj(self):
        obj_count = len(ContentObject.query.filter_by().all())
        if obj_count >= 1000:
            logger.warn('Too many requests')
            return
        else:
            obj = ContentObject()
            db.session.add(obj)
            db.session.commit()
            return obj

c = GetHTTPContent(['https://buddy.ai', 'https://google.com'])
print(c.get_content())

Ответ

Функция фактически генератор и выполняет два HTTP-запроса на URL. Свойство content_obj создаёт запись с побочными эффектами и возвращает None при лимите.

print(c.get_content()) выводит объект генератора, а не скачанные данные; тело начнёт выполняться при обходе. Аннотация должна отражать Iterator[bytes] либо реализация должна действительно возвращать список строк.

Скачивайте каждый URL один раз с timeout и ограничением размера, закрывайте response. Создавайте объект с готовым содержимым и фиксируйте его одной транзакцией. len(query.all()) замените подсчётом в БД, но помните: проверка числа записей перед вставкой сама по себе не защищает от гонки. Лимит требует согласованного механизма.

Уберите изменяемый default, используйте logger.warning, явную ошибку при лимите и rollback при сбое записи. Не скрывайте создание и commit за property.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее