Pydantic-settingsでCLIアプリケーションを作成できる話
AI TL;DR
pydantic-settings を使用することで、簡単に型安全で保守性の高いCLIアプリケーションを作成できます。 argparseの代わりに、pydanticのようなクラスベースの設定を利用し、環境変数やCLI引数の読み込みが可能です。 最新バージョンでは、CLI引数のパースがサポートされ、エイリアスやデフォルト値の設定、型ヒントの補完も簡単に行えます。また、subcommandの実装もシンプルにでき、複雑なCLIツールの作成が容易になります。
pydantic-settingsについて
pydantic-settingsは、環境変数やdotenvファイルなどから設定を読み込むためのライブラリとして有名です。
ただそれだけならpydanticの機能で十分だと思っていたのですが、最近CLIの引数から設定を読み込む機能が追加されました。ちなみにAzure Key Vaultもサポートされていますが、AWS Systems Managerのパラメータストアはなぜかサポートされていません (2024/10現在)。Issueはあるのでそのうち対応される可能性はあります。
pythonのbuiltinのコマンドライン引数のパーサーである argparse は、型の指定が難しく、Namespaceを二重定義する必要があるなどの問題があります。書き捨てるようなScriptには良いのですが、型の補完が効かないので、ある程度大きなCLIアプリケーションを作成するのは少し面倒です。
pydantic-settings は、pydanticと同様のクラスを書くだけで、CLI引数のパーサーが完成して、型の指定やデフォルト値の設定が簡単に行え、型ヒントもうまく動くので、補完が効いて快適な開発ができます。
他にも、pydanticを使ってargparseをラップするようなライブラリは複数ありますが、ほぼ公式とも言えるpydantic-settingsを使用するのがメンテナンス性やサポート面で有利だと思います。また、argparseのGroup以外の機能は使えるので、基本的に必要な機能が網羅されています。
install
versionごとに多少仕様が異なるので、今回は2.6.0を指定しました。 基本的にはDocumentationを参照してください。
使い方
以下のように、単純なCLIアプリケーションであればほぼpydanticのクラスを書くだけで実装できます。 literalやenumも使えます。
DocstringやFieldのdescriptionを活用することで、helpメッセージをカスタマイズできます。
"simple.py"
このスクリプトは以下のように動きます。helpメッセージもちゃんとカスタマイズされていることがわかります。
実行は以下のようにできます。ちゃんと綺麗に型がついたpydantic objectが得られます。
Subcommand
subcommandも問題なく実装できます。CliSubCommand を型Annotationに指定することで、subcommandを指定できます。
例えばgit likeなCLIを作ってみます。
get_subcommand を使う場合
基本的にはget_subcommandで得られる型を使って分岐します。全て自前でかけるので、個人的には柔軟性が高いと思っています。
"subcommand.py"
CliAppを使う場合
CliApp は、各クラスのcli_cmd メソッドを自動で実行してくれるものです。subcommandに関しても再帰的に実行してくれます。
ただし、こちらの場合親クラスのパラメータを下に引き継ぐのがめんどうなので、個人的にはget_subcommandでいいのかな、と思っています。
それが必要ない場合は楽で良さそうです。
"subcommand_app.py"
終わりに
pydantic-settingsのCLI部分はかなり精力的に機能追加が行われており、今後もさらに使いやすくなると思います。 結構頻繁に更新されるので、最新のドキュメントを参照するとやれることが増えているかもしれません。