見出し画像

【Python】argparseの引数名を呼び出す関数の変数名に合わせておく

はじめに

argparseの引数名は呼び出す関数の変数名に合わせておく方法を紹介する

理由は以下の3つ

  • キーワード引数 kwargs形式で関数呼び出しを行うことができる

  • コードの一貫性が保たれ、可読性があがる

  • 呼び出し側の関数仕様の変更に対応することができる

理由

キーワード引数 kwargs形式で関数呼び出しを行うことができる

argparseでは、下記手順でkwargs引数形式にて関数呼び出しが可能

16行目:parser.parse_args()のように、引数入力の情報を受け取った後に、

17, 18行目:辞書形式に変換した後、キーワード引数の形式で関数呼び出し

def main(name: str, age: int, weight: float):
    print(f"name is {name}")
    print(f"age is {age}")
    print(f"weight is {weight}")

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser()

    parser.add_argument("name", type=str)
    parser.add_argument("-a", "--age", type=int, default=20)
    parser.add_argument("--weight", type=float, default=60.0)

    args = parser.parse_args()
    kwargs = args.__dict__
    main(**kwargs)

シェル側からは、以下のように呼び出す

$ python argparse_name.py taro -a 18 --weight 65.0
name is taro
age is 18
weight is 65.0

コードの一貫性が保たれ、可読性があがる

argparseの出力をキーワード引数で渡すことで、コードの一貫性が保たれ、可読性が向上する

下記、コードの一貫性が保たれず、不用意に読みにくくなってしまう例

def main(friend_name: str, friend_age: int, friend_weight: float):
    print(f"name is {friend_name}")
    print(f"age is {friend_age}")
    print(f"weight is {friend_weight}")

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser()

    parser.add_argument("name", type=str)
    parser.add_argument("-a", "--age", type=int, default=20)
    parser.add_argument("--weight", type=float, default=60.0)

    args = parser.parse_args()
    args = args.__dict__.values()  # 辞書の値のみを抽出
    main(*args)  # 位置引数で渡す
$ python argparse_name.py taro -a 18 --weight 65.0
name is taro
age is 18
weight is 65.0

呼び出し側の関数仕様の変更に対応することができる

agparseでは、キーワード引数を活用することで、関数の仕様変更に対応することができる

  • 呼び出し側引数が削除:予期しないキーワード引数の入力により、エラー発生

  • 呼び出し側引数が追加:必要なキーワード引数の入力不足により、エラー発生

def main(name: str, age: int, height: float): # 新しい引数heightが追加され、weightが削除
    print(f"name is {name}")
    print(f"age is {age}")
    # print(f"weight is {weight}")
    print(f"height is {height}")

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser()

    parser.add_argument("name", type=str)
    parser.add_argument("-a", "--age", type=int, default=20)
    parser.add_argument("--weight", type=float, default=60.0)

    args = parser.parse_args()
    kwargs = args.__dict__
    main(**kwargs)
$ python argparse_name.py taro -a 18 --weight 65.0
Traceback (most recent call last):
  File "*/argparse_name.py", line 19, in <module>
    main(**kwargs)
TypeError: main() got an unexpected keyword argument 'weight'

いいなと思ったら応援しよう!