Python の argparse はコマンドラインの入力を解析します。
import argparse parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age') args = parser.parse_args() print(args)
このコードを start.py に保存し、さまざまな入力で print(args) の結果を確認してみます。
python start.py error: the following arguments are required: name python start.py --age 28 error: the following arguments are required: name python start.py Alice Namespace(name='Alice', age=None) python start.py Alice --age 28 Namespace(name='Alice', age='28') python start.py Alice --age=28 Namespace(name='Alice', age='28') python start.py name=Alice --age 28 Namespace(name='Alice', age='28') python start.py --age 28 name=Alice Namespace(name='name=Alice', age='28') python start.py name Alice --age 28 error: unrecognized arguments: Alice
あらためて argparse の使い方をまとめます。
ArgumentParser でパーサーをつくる
add_argument で引数を定義する
parse_args でユーザー入力を得る
name は(ファイル名を除く)第一引数になり、入力必須です。入力を義務づけない引数、つまりオプション引数は -age または --age といったハイフンのスタイルにします。
コンソールの結果から argparse のルールと性質がわかります。
オプション引数の値は、半角スペースでつなげても、イコールでつなげてもいい
必須引数は、引数名を明示するときは半角スペースでなくイコールでつなげる(name=Alice は許可され、name Alice は許可されない)
オプション引数を最初に入力してもいい
下から二番目と三番目の結果より、必須引数の順番を変えると入力値に引数名が入りかねないとわかります。
オプション引数のデフォルト値
import argparse parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', default=40) args = parser.parse_args() print(args)
オプション引数にはデフォルト値を定義できます。
python start.py Alice Namespace(name='Alice', age=40) python start.py Alice --age 28 Namespace(name='Alice', age='28')
--age を入力しないとデフォルト値の 40 が入ります。
Namespace から値をとる
parse_args の返り値 Namespace は辞書型のように扱えます。
import argparse parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', default=40) args = parser.parse_args() print(args) print(args.name) print(args.age)
Namespace(name='Alice', age='28') Alice 28
定義していない引数をドットでつなげるとエラーが起きます。
import argparse parser = argparse.ArgumentParser() parser.add_argument('name') parser.add_argument('--age', default=40) args = parser.parse_args() print(args) print(args.height)
'Namespace' object has no attribute 'height'