Back to questions
СБЕР
Middle
6
import fastapi import requests app = fastapi.FastAPI() @app.get() def get_posts(first_n, custom_ids: list = []): ids = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] posts = [None for i in range(first_n)] i = 0 for post_id in (custom_ids or ids[:first_n]): url = f"[link] response = requests.get(url, verify=False) posts[i] = response.json() return posts
Companies where asked
Answer from AI
sobes.tech AI
В представленном коде есть несколько проблем и неточностей:
- Декоратор
@app.get()требует указания пути, например@app.get("/posts"). - Параметры функции должны быть аннотированы с типами и по возможности с дефолтными значениями для FastAPI.
- Параметр
custom_ids: list = []лучше заменить наcustom_ids: Optional[List[int]] = None, чтобы избежать мутабельных дефолтных аргументов. - В цикле используется
(custom_ids or ids[:first_n]), но еслиcustom_idsпустой список, он будет проигнорирован, что может быть неочевидно. - Отступы в коде нарушены,
return postsдолжен быть внутри функции. - Запросы к внешнему URL выполняются синхронно, что может замедлить работу API.
Пример исправленного варианта с использованием FastAPI и асинхронных запросов через httpx:
from fastapi import FastAPI, Query
from typing import List, Optional
import httpx
app = FastAPI()
ids = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
@app.get("/posts")
async def get_posts(first_n: int = 5, custom_ids: Optional[List[int]] = Query(None)):
selected_ids = custom_ids if custom_ids else ids[:first_n]
posts = []
async with httpx.AsyncClient(verify=False) as client:
for post_id in selected_ids:
url = f"https://example.com/posts/{post_id}"
response = await client.get(url)
posts.append(response.json())
return posts
Такой подход улучшит читаемость, корректно обработает параметры и повысит производительность за счет асинхронных запросов.