Pydantic でコマンドライン引数をパースする
Pydantic でコマンドライン引数をパースすることで、コマンドライン引数のバリデーションを行うことができる。
引用
BaseModel を継承したクラスに、以下の関数を書き加えます
| @classmethod
def parse_args(cls):
parser = ArgumentParser()
for k in cls.schema()["properties"].keys():
parser.add_argument(f"-{k[0:1]}", f"--{k}")
return cls.parse_obj(parser.parse_args().__dict__)
|
| from argparse import ArgumentParser
from pydantic import BaseModel
class Argments(BaseModel):
"""
Pythonファイルの引数を定義する
"""
bucketname: str # AWSのバケット名
filename: str # ファイル名
timeout: int # タイムアウト時間
@classmethod
def parse_args(cls):
# 付け足した関数
parser = ArgumentParser()
for k in cls.schema()["properties"].keys():
parser.add_argument(f"-{k[0:1]}", f"--{k}")
return cls.parse_obj(parser.parse_args().__dict__)
# 実行してみる: 引数を検証する
args = Argments.parse_args()
print(args)
print(args.bucketname)
print(args.timeout)
|
複数のクラスと対応する場合は、mixin でそれぞれのクラスを継承した ArgumentParser クラスを作成して、どのクラスでインスタンス生成するかの分岐ができそう。