1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-07-06

はじめに

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'
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?