В импорте опасны общий изменяемый аргумент по умолчанию, вероятный блокирующий API-вызов и слишком широкий обработчик ошибок. Повторный запуск также требует защиты от дублирования заказов.
async def import_orders(
В импорте опасны общий изменяемый аргумент по умолчанию, вероятный блокирующий API-вызов и слишком широкий обработчик ошибок. Повторный запуск также требует защиты от дублирования заказов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
async def import_orders( self, customer_ids: list[int], imported_orders: list[dict[str, Any]] = [], ) -> dict[str, Any]: """ Импортирует заказы для списка клиентов """ results = { "created": 0, "failed": 0, "orders": imported_orders, }
for customer_id in customer_ids:
try:
# Внешний API возвращает список сырых заказов клиента.
orders = self.api_client.get_orders(customer_id)
for order in orders:
normalized_order = await self.normalize_order(order)
# Отменённые заказы не должны попадать в БД
if normalized_order["status"] == "cancelled":
continue
await self.save_order(normalized_order)
results["created"] += 1
results["orders"].append(normalized_order)
except Exception as error:
logger.error(
f"Cannot import orders for customer {customer_id}: {error}"
)
results["failed"] += 1
return results
async def normalize_order(self, order: dict[str, Any]) -> dict[str, Any]: """ Преобразует заказ из формата внешнего API во внутренний формат.
Внешняя система может возвращать дополнительные поля, поэтому
импортёр сохраняет только данные, необходимые для локального сервиса.
Args:
order: Исходный заказ, полученный из API.
Returns:
Нормализованный словарь с данными заказа.
"""
Ответ
В импорте опасны общий изменяемый аргумент по умолчанию, вероятный блокирующий API-вызов и слишком широкий обработчик ошибок. Повторный запуск также требует защиты от дублирования заказов.
Замените default на None и создавайте отдельный список; если переданный список нельзя менять, копируйте его. Для синхронного сетевого клиента используйте неблокирующий аналог либо вынос вызова в поток. Ошибка одного заказа сейчас прерывает импорт остальных заказов клиента, а failed считает клиентов, не заказы. Определите семантику счётчиков и границы транзакций. Нужны валидация ответа, timeout и уникальный внешний ID заказа. Если normalize_order содержит только показанный docstring, она возвращает None, поэтому обращение к status упадёт.