Pythonで環境変数を読み込むときはpydanticを使うと便利


アプリケーションを実装する際、環境変数の扱いって微妙に面倒ですよね?

Pythonで実装する際、pydanticというライブラリを使うと、デフォルト値をセットしたり、int型にキャストしたり、 .env から値を読み込むなどの処理を簡単に実装することができます。今回の記事ではそれらのサンプルコードを紹介します。

ちなみに、pydanticは環境変数を読み込むだけのライブラリでは無く、型アノテーションを利用してクラスを定義できるライブラリで、他にも例えばjson形式のデータをクラスにキャスト・バリデーションすることができます。他の機能についてまとまって読みたい方は、次の記事を読んでください。

Pydantic 入門

環境変数を読み込む

次のような環境変数がセットされているとします。

# bash形式
export REDIS_HOST_NAME=localhost
export REDIS_PORT=6379

pydanticを使えば、次のようなコードで読み出せます。

from pydantic import BaseSettings

class Settings(BaseSettings):
    redis_host_name: str
    redis_port: int

settings = Settings()

print(settings.redis_host_name)
# => localhost
print(settings.redis_port)
# => 6379
print(type(settings.redis_port))
# => <class 'int'>

もし環境変数がセットされていない場合や、型キャストに失敗した場合はバリデーションエラーを出してくれます。

pydantic.error_wrappers.ValidationError: 1 validation error for Settings
redis_port
  value is not a valid integer (type=type_error.integer)

dotenvを利用する

開発中、環境変数を設定するのを簡略化するため .env というファイル形式を利用できます。node.jsの記事ですが、こちらがわかりやすいと思います。

環境変数の代わりに .env ファイルを使用する (dotenv)

まず、 pip install python-dotenvpip install pydantic[dotenv]python-dotenvも併せてインストールする必要があります。

次のような .env ファイルがあるとすると、

.env
REDIS_HOST_NAME=localhost
REDIS_PORT=6379

次のようなコードで読み込むことができます。

from pydantic import BaseSettings

class Settings(BaseSettings):
    redis_host_name: str
    redis_port: int

    class Config:
        env_file = '.env'

settings = Settings()

更に詳しい機能

これで普段の開発でよく使う環境変数関連の便利な機能は紹介できたと思います。更に知りたい方は、公式ドキュメントの該当項目を読んでみてください。

Settings management - pydantic