Cover Image for pydantic のススメ

pydantic のススメ

2022/08/27

概要

この記事は、Python のライブラリ紹介記事です。環境変数の読み込み方法はいくつかありますが、まず、python-dotenv の使用例を紹介し、次に pydantic の使い方について紹介します。

dotenv

dotenv は環境変数などを読み込むために使用します。例えば、DB へのコネクションを作るために各種パラメータを python-dotenv を使って読み込みます。

setup

pip install python-dotenv

コード例

.env

host=host_name
port=1234
database=hoge_db
db_user=my_user
password=my_password

dotenv_sample.py

import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

host = os.environ.get("host")
port = os.environ.get("port")
database = os.environ.get("database")
db_user = os.environ.get("db_user")
password = os.environ.get("password")

params = {
    "host": host,
    "port": port,
    "database": database,
    "user": db_user,
    "password": password
}

print(params)

実行結果

このプログラムの実行結果が下記です。

{
  'host': 'host_name',
  'port': '1234',
  'database': 'hoge_db',
  'user': 'my_user',
  'password': 'my_password'
}

このパラメータを使って DB とのコネクションを作成したところ、port が文字列のため TypeError となってしまいました。int でキャストするのはイケてない気がしたので何か方法がないか調べたところ、python-dotenv をラップして型定義ができる pydantic というライブラリがあることを知りました。

pydantic

setup

pip install pydantic

コード例

pydantic は最初に class と型を書き、.env のパスを指定します。そして、インスタンスを生成するだけで環境変数が読み込まれます。dotenv と比べると、必要な情報を一箇所にまとめられるのでとても良いと思いました。

pydantic_sample.py

from pydantic import BaseSettings
from os.path import join, dirname

class Settings(BaseSettings):
    host: str
    port: int
    database: str
    db_user: str
    password: str

    class Config:
        env_file = join(dirname(__file__), '.env')

settings = Settings()

params = {
    "host": settings.host,
    "port": settings.port,
    "database": settings.database,
    "user": settings.db_user,
    "password": settings.password
}

print(params)

実行結果

{
  'host': 'host_name',
  'port': 1234,
  'database': 'hoge_db',
  'user': 'my_user',
  'password': 'my_password'
}

まとめ

今回は pydantic の使用例について書きました。pydantic は class 内に型の定義と、ファイルの読み込み先を指定できます。必要な情報を一箇所にまとめられるのでコードを読む時も助かります。今後は pydantic を使用していきたいと思います。

参考