Применение Pydantic-моделей к API-ответам
В этом посте показывается как использовать Pydantic-модели с полученными по API-данными.
Реклама
В посте "AIOgram3 13. Прогноз погоды в боте - OpenWeatherMap" мы с вами добавили прогноз погоды к боту, просто так, что бы был. С тех пор "много воды утекло" и я хочу осовременить код, добавить валидацию получаемых данных и удобный к ним доступ.
Без лишних слов:
- Создаём 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]
- В функции
request_weather()
создаём объект модели:
# ...код функции
if result.get("count"):
weather_response = WeatherResponse(**result)
return generate_result(weather_response, city)
- Переписываем функцию
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.
Все статьи