Python

【Python】argparseの引数名は呼び出す関数の変数名に合わせておくべき3つの理由

2022年9月17日

※ 本ブログはプロモーションが含まれています

【Python】argparseの引数名は呼び出す関数の変数名に合わせておくべき3つの理由

ポロシャツエンジニア

3分で技術が身に付くブログ!
・ポロシャツを愛するエンジニア
・企業にて研究開発職
・画像処理 | Deep Learning

Pythonにて、argparseの引数名は呼び出す関数の変数名に合わせておくべき3つの理由を紹介します!

おすすめの読者

  • argparseの活用方法がわからない方
  • argparseの引数名に迷っている方
  • argparseをより活用したい方

【結論】argparseの引数名は呼び出す関数の変数名に合わせておくべき!

結論、argparseの引数名は呼び出す関数の変数名に合わせておくべきです。

本記事の内容を深く理解するためには、 入門 Python 3 Effective Python Pythonプログラムを改良する90項目 がおすすめです!

理由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'

【まとめ】argparseの引数名は呼び出す関数の変数名と一緒に!

argparseの引数名は呼び出す関数の変数名に合わせておくべき理由3選を解説しました!

理由3選

  • キーワード引数 kwargs形式で関数呼び出しを行うことができるため!
  • コードの一貫性が保たれ、可読性があがるため!
  • 呼び出し側の関数仕様の変更に対応することができるため!


初心者にはこちらがおすすめ!
中級・上級者にはこちらがおすすめ!
  • この記事を書いた人

ポロシャツエンジニア

3分で技術が身に付くブログ!
・ポロシャツを愛するエンジニア
・企業にて研究開発職
・画像処理 | Deep Learning

-Python