アプリケーションを実装する際、環境変数の扱いって微妙に面倒ですよね?
Pythonで実装する際、pydanticというライブラリを使うと、デフォルト値をセットしたり、int型にキャストしたり、 .env
から値を読み込むなどの処理を簡単に実装することができます。今回の記事ではそれらのサンプルコードを紹介します。
ちなみに、pydanticは環境変数を読み込むだけのライブラリでは無く、型アノテーションを利用してクラスを定義できるライブラリで、他にも例えばjson形式のデータをクラスにキャスト・バリデーションすることができます。他の機能についてまとまって読みたい方は、次の記事を読んでください。
環境変数を読み込む
次のような環境変数がセットされているとします。
# 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-dotenv
か pip install pydantic[dotenv]
でpython-dotenvも併せてインストールする必要があります。
次のような .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()
更に詳しい機能
これで普段の開発でよく使う環境変数関連の便利な機能は紹介できたと思います。更に知りたい方は、公式ドキュメントの該当項目を読んでみてください。