コンテンツにスキップ

Pydantic でコマンドライン引数をパースする

Pydantic でコマンドライン引数をパースすることで、コマンドライン引数のバリデーションを行うことができる。

引用

BaseModel を継承したクラスに、以下の関数を書き加えます

1
2
3
4
5
6
7
@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 クラスを作成して、どのクラスでインスタンス生成するかの分岐ができそう。