🎉

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