Cat

Применение Pydantic-моделей к API-ответам

В этом посте показывается как использовать Pydantic-модели с полученными по API-данными.

Tips & Tricks proDream 25 Август 2024 Просмотров: 110

В посте "AIOgram3 13. Прогноз погоды в боте - OpenWeatherMap" мы с вами добавили прогноз погоды к боту, просто так, что бы был. С тех пор "много воды утекло" и я хочу осовременить код, добавить валидацию получаемых данных и удобный к ним доступ.

 

Без лишних слов:

  1. Создаём Pydantic-модели на основе полученного JSON:
class WeatherDescription(BaseModel):  
    description: str  


class WeatherMainInfo(BaseModel):  
    temp: float  
    feels_like: float  
    pressure: float  
    humidity: int  


class WeatherWindInfo(BaseModel):  
    speed: float  


class WeatherData(BaseModel):  
    main: WeatherMainInfo  
    wind: WeatherWindInfo  
    rain: dict | None = None  
    snow: dict | None = None  
    weather: list[WeatherDescription]  


class WeatherResponse(BaseModel):  
    count: int  
    list: list[WeatherData]

 

  1. В функции request_weather() создаём объект модели:
# ...код функции
if result.get("count"):  
    weather_response = WeatherResponse(**result)  
    return generate_result(weather_response, city)

 

  1. Переписываем функцию generate_result() для получения данных из объекта модели:
def generate_result(data: WeatherResponse, city: str) -> str:  
    weather_data = data.list[0]  
    rain = ("ожидается", "не ожидается")[weather_data.rain is None]  
    snow = ("ожидается", "не ожидается")[weather_data.snow is None] 
    return f"""  
<b>Прогноз погоды в городе {city}</b>  

Сейчас температура {weather_data.main.temp}°C  
Ощущается как {weather_data.main.feels_like}°  
⛅️{weather_data.weather[0].description}⛅️  
💨 Скорость ветра {weather_data.wind.speed}м/с 💨  
Давление {weather_data.main.pressure * 0.75} мм рт.ст.Влажность {weather_data.main.humidity}%  
💦 Дождь {rain}  
❄️ Снег {snow}  
"""

 

Полный код бота доступен в нашем репозитории для подписчиков Boosty.

Автор

    Нет комментариев

    Реклама