メインコンテンツへスキップ
見出し画像

【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'
     
     
    日系企業で画像・自然言語・AIアプリケーションの研究開発をしています。博士(工学)なども。読書・ガジェット・習慣改善などに興味があります。(記事内Amazon適格販売広告含む)

    あなたへのおすすめ