私は頻繁に誰か様が描いてくださったコード・レポジトリをgithubからcloneして、自分用にカスタマイズする。
そのせいもあり、あまり基本的なコードを一から書いたりする機会が少ない。
備忘録として、argparseについて書いておく。
公式
どこかの誰かがなんというまいが、公式が全てだと思っている
しかしながら、公式ドキュメントと言うのは、あまりにも情報がぎゅっとされていて、凡人の私には理解が難しい時がある。
わかりやすい言葉でできる限り簡単にまとめたい。
基本形
基本形は下記、これに色々付け足していく形となる。
ArgumentParserがコマンドラインとスクリプトの中心的存在となっている。
parse_argsメソッドでパースを実行し、入力した引数をNamespaceオブジェクトに配置する。
import argparse # argparseモジュールをimport
parser = argparse.ArgumentParser() # ArgumentParserインスタンス生成
args = parser.parse_args() # parse_argsメソッド呼び出し
print(args)
> python test_argparse.py
Namespace()
引数を何を入力していないので、Namespaceには何も配置されていない。
以下で引数の設定についてみていこう。
コマンドライン引数入力を強制する
parser.add_argument()
メソッドで各引数の仕様をparserに与えていく。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("arg_1") # 引数を指定(位置引数)
args = parser.parse_args()
print(args)
スクリプト実行時にコマンドラインで引数を与えてあげることで, Namespaceに値が入っていることが確認できる。
> python test_argparse.py 100
Namespace(arg_1="100")
(後述するrequiredを使うことでコマンドライン引数の入力を必須にすることも可能)
コマンドライン引数の入力を任意にする
ハイフンを2つつけることでコマンドライン引数の入力を任意にすることができる。parser.add_argument("--arg_2")
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("arg_1") # 引数を指定
parser.add_argument("--arg_2") # オプション引数
args = parser.parse_args()
print(args)
> python test_argparse.py 100
Namespace(arg_1="100" arg_2=None)
# add_argumentで指定した引数名の後に半角空けて、渡したい値・文字を入力する
> python test_argparse.py 100 --arg_2 200
Namespace(arg_1="100" arg_2=200)
# 引数名の入力がめんどくさいときにはハイフン1つと引数名の頭文字でも可能
> python test_argparse.py 100 -a 200
Namespace(arg_1="100" arg_2=200)
add_argumentの他の機能
type : input typeを指定する
type=指定したい型
で型指定が可能
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg_1", type=int) # int型を指定
parser.add_argument("--arg_2", type=str) # str型を指定
args = parser.parse_args()
print(args)
> python test_argparse.py --arg_1 100 --arg_2 200
Namespace(arg_1=100, arg_2='200')
# int型指定の引数に文字を入力するとエラーになる
> python test_argparse.py --arg_1 hello --arg_2 200
test_argparse.py: error: argument --arg_1: invalid int value: 'hello'
required : 入力を必須にする
required=True, Falseで指定できる
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg_1", type=str, required=True)
args = parser.parse_args()
print(args)
# required=Trueにした引数がないとエラーになる
> python test_argparse.py
test_argparse.py: error: the following arguments are required: --arg_1
# 正常な挙動
> python test_argparse.py --arg_1 hello
Namespace(arg_1="hello")
default : default値を設定する
引数の指定がない際に使われる値を設定する
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg_1", type=int, default=10000)
args = parser.parse_args()
print(args)
# required=Trueにした引数がないと上記で設定したdefault値になる
> python test_argparse.py
Namespace(arg_1=10000)
# 指定すると値が反映される
> python test_argparse.py --arg_1 30
Namespace(arg_1=30)
choices : 決められた候補の値から選ぶようにする
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg_1", choices=["one", "two", "three"])
args = parser.parse_args()
print(args)
# 何も指定しない場合にNamespaceに返される値
> python test_argparse.py
Namespace(arg_1=None)
# choicesにない値を指定するとエラーになる
> python test_argparse.py --arg_1 four
usage: test_argparse.py [-h] [--arg_1 {one,two,three}]
test_argparse.py: error: argument --arg_1: invalid choice: 'four' (choose from 'one', 'two', 'three')
# 通常の挙動
> python test_argparse.py --arg_1 one
Namespace(arg_1='one')
action
actionにも色々あるが、代表的なstoreについてのみ記述する
store系 : 設定した値を返す
store系には主に三つある
- store_const
- store_true
- store_false
引数が与えられたときにconst, true, falseをそれぞれ返す。スイッチみたいな役割をしている。
store_constの場合は別でconstを指定する。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--arg_1", action = "store_const", const=100)
parser.add_argument("--arg_2", action = "store_true")
parser.add_argument("--arg_3", action = "store_false")
args = parser.parse_args()
print(args)
# 何も指定しない場合にNamespaceに返される値
> python test_argparse.py
Namespace(arg_1=None, arg_2=False, arg_3=True)
# 指定するとそれぞれ値が反映される
> python test_argparse.py --arg_1 --arg_2 --arg_3
Namespace(arg_1=100, arg_2=True, arg_3=False)
まとめ
実際にコードを書いて、実行してみることで挙動がよく理解できる。
これぐらいのコードであれば簡単に実行できるので、動かしながら確認するようにするのが良い
コメント