Функция фактически генератор и выполняет два 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.