✴️ Клас для налаштувань за допомогою pydantic_settings
python-dotenv — це добре, але лише тоді, коли налаштувань небагато.
Існує бібліотека pydantic_settings яка використовує pydantic та python-dotenv і дозволяє:
1️⃣ Об'єднати всі змінні в один клас.
2️⃣ Конвертувати та валідувати значення змінних із рядків у потрібні типи.
3️⃣ Підтримувати вкладені класи, що дає змогу згрупувати змінні за призначенням.
4️⃣ Зменшити ймовірність розкриття секретних значень при виводі через print або при логувані
5️⃣ Інші тонкі налаштування.
🔗 Pydantic Settings Documentation
Уявімо ситуацію, коли нам потрібно зберігати список ID адміністраторів бота та налаштування підключення до бази даних. pydantic_settings уміє працювати з базовими типами, включно зі списками та множинами (парсити їх за допомогою бібліотеки json). Також бібліотека надає широкий простір налаштування процесу валідації під конкретні потреби.
Файл .env
BOT__TOKEN="Ваш токен"
BOT__ADMINS=[1361728070, 1060557517]
DB__HOST=localhost
DB__PORT=5432
DB__USER=postgres
DB__PASSWORD=mysecretpassword
DB__NAME=mydatabase
Фай main.py
# pip insatall pydantic
from pydantic import BaseModel, SecretStr
# pip insatall pydantic_settings
from pydantic_settings import BaseSettings
class BotSettings(BaseModel):
token: SecretStr # BOT__TOKEN
admins: frozenset[int] # BOT__ADMINS
class DatabaseSettings(BaseModel):
host: str # DB__HOST
port: int = 5432 # DB__PORT
user: str # DB__USER
password: SecretStr # DB__PASSWORD
name: str # DB__NAME
class Settings(BaseSettings):
bot: BotSettings
db: DatabaseSettings
async def main():
settings = Settings(
_env_file=".env",
_env_nested_delimiter='__'
)
print(repr(settings))
# use: settings.bot.token.get_secret_value()
# for get origin token value
if __name__ == "__main__":
asyncio.run(main())
Вивід:
Settings(bot=BotSettings(token=SecretStr('**********'), admins=frozenset({1060557517, 1361728070})), db=DatabaseSettings(host='localhost', port=5432, user='postgres', password=SecretStr('**********'), name='mydatabase')
245 · Messaggio✴️ Клас для налаштувань за допомогою pydantic_settings
17 ottobre 2025Vicino nel feed
Pquesto messaggio
P