はじめに
Pydantic は、Python のデータバリデーションと設定管理のためのライブラリとして広く利用されています。とくに、データモデルの定義とバリデーションを簡潔に行うことができるため、多くのプロジェクトで採用されています。
普段 Python で CLI アプリケーションを作成するとき、google/python-fire を選択していることが多いです。
しかし、Pydantic のドキュメントに、CLI アプリケーションの作成方法についても記載されています。
本記事では、Pydantic Settings を使用して CLI アプリケーションを作成する方法について学んだことをまとめます。
成果物
https://github.com/kntks/blog-code/tree/main/2024/11/pydantic-cli
環境
| バージョン |
---|
Mac | Ventura 13.2.1 |
uv | 0.5.1 |
Python | 3.12.2 |
環境構築
環境構築には uv を使用し、pydantic と pydantic-settings をインストールします。
pydantic-settings は、環境変数やシークレットファイルから設定を読み込むためのライブラリです。Pydantic と組み合わせて使用することで、機能を拡張できます。
Pydantic CLI アプリケーションの作成
Pydantic を使った CLI アプリケーションのユースケースは主に以下の2つです。
- Pydantic モデルのフィールドをオーバーライドするため
- Pydantic モデルを使ってCLIを定義するため
引用:https://docs.pydantic.dev/latest/concepts/pydantic_settings/#command-line-support
今回は2番目にある CLI を定義するために、Pydantic モデルを使用します。
サンプルコード
CliApp クラスは CliApp.run
と CliApp.run_subcommand
の2つのユーティリティメソッドを提供し、BaseSettings
、BaseModel
、pydantic.dataclasses.dataclass
を CLI アプリケーションとして実行できます。
paydantic.dataclasses
を使用してデータモデルを定義し、CliApp.run
メソッドを使用して CLI アプリケーションを実行します。このときデータモデルに cli_cmd
メソッドを定義することで、コマンドライン引数を受け取り、処理を実行できます。
引数をリストとして解析する際、以下の3つのスタイルを任意に組み合わせることができます。
- JSONスタイル
--field='[1,2]'
- Argparseスタイル
--field 1 --field 2
- Lazyスタイル
--field=1,2
引数を辞書型として解析する際、以下の2つのスタイルを任意に組み合わせることができます。
- JSONスタイル
--field='{"k1": 1, "k2": 2}'
- 環境変数スタイル
--field k1=1 --field k2=2
Literal
と Enum
は、特定の値のみを受け入れる型を定義するために使用されます。
たとえば、--fruit
に apple
を指定すると以下のエラーが発生します
pydantic にはフィールドにエイリアスを設定するための AliasChoices
、Field
クラスが用意されています。エイリアスは、フィールドに別名を付けることができます。
Pydantic Settings は CliSubCommand
と CliPositionalArgument
という型があります。これらを使用することでサブコマンドと位置引数を定義できます。
注意として、必須フィールド(デフォルト値を持たないフィールド)にのみ適用でき、サブコマンドは pydantic BaseModel
または pydantic.dataclasses
データクラスから派生した有効な型でなけば使用できません。
CLI で Boolean のフラグを使用する場合、明示的に指定する方法 --flag=True
と、暗黙的に指定する方法 --flag
の2つあります。
CLI Boolean Flags に載っているサンプルコードを少し変更して、CliApp.run
で実行できるようにします。
実際にコードを実行してみて、引数を1つずつ減らしてみます。
所感
面白そうだったため、とりあえず手を動かして触ってみました。環境変数のバリデーションと CLI のオプションを同時にバリデーションしながら pydantic のデータモデルを使用できるのは便利だと感じました。
(設定ミスかもしれませんが)挙動がおかしいところがあったためユースケースによっては注意が必要です。
https://github.com/fastapi/typer というライブラリもあるため、組み合わせればより柔軟な CLI アプリケーションを作成できるかもしれません。