🎉
Python argparse の簡単な使い方:オプション引数とデフォルト値
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'
Discussion