はじめに
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'