今回は python のライブラリである argparse について説明していきたいと思います。なかなか、使う機会がないため、困る人も多いと思ったので、今回、分かりやすく、ご紹介しようと思います。

argparse って何?? (What is ‘argparse’)

Big red glossy question mark on yellow background. 3D rendering

まず、初めに argparse とは何かを説明します。 argparse とはエディター上ではなく、コマンドライン上で引数を指定するためのライブラリです。通常引数は関数を定義する時に使います。例えば、下の様なコードです。

def add(a,b):
    result = a + b
    return result

print(add(6,10))

これの出力結果は 16 になります。この場合、add関数に a と b の2つの引数を渡してその引数同士を足しているため、このような結果が生じます。これは皆さんに馴染みのある引数の指定だと思います。では、今回のメインの argparse とは何かを説明するためにまず、具体例を出したいと思います。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a")
parser.add_argument("abc")
parser.add_argument("jkl")

args = parser.parse_args()

print(f"a = {args.a}")
print(f"abc = {args.abc}")
print(f"jkl = {args.jkl}")

argparse はこの様にコードを書くことで実行されます。このコードを実行するために

python arg.py 引数a 引数abc 引数jkl

このコードを打ち込むと

a = 引数a
abc = 引数abc
jkl = 引数jkl

という結果が出てきます。これはターミナルで arg.py の引数a が a に、引数abc が abc に、引数jkl が jkl に代入されたことを示します。つまり、エディター上ではなく、コマンドライン上で引数を指定できるようにするのが、argparse の役割です。

argparse の利点 (advantage of argparse)

次に私が思う argparse の利点について話したいと思います。私が思う argparse の利点は2つあると思います。

1つ目は後から引数を選択するため、データを選びやすいということです。これは特に機械学習を行う時に恩恵を受けると思います。機械学習ではモデルを作り、そのモデルに合わせてデータを学習していきます。その時に様々なデータを使うと思いますが、エディター上でデータの引数を管理するのは若干面倒が多いです。特に、大規模なデータになってくるとローカル上ではなく、サーバーに接続して、実行することが多いと思うため、エディター上ではなく、コマンドライン上でデータを引数として渡せるのが1つ目の利点です。

2つ目は引数のオプションが多数あることです。 argparse のオプションは有名なもので help, type, default など便利なオプションが多数あります。そのオプションを使うことでより引数が使いやすくなると思います。そこで今回はいくつか代表的なオプションを具体例と共にご紹介したいと思います。

オプション① ~help~

Boy holding a sign with text help on it

まず、最初のオプションは help です。これは argparse にどんな引数が必要か忘れた時に、必要な引数を教えてくれるお助けマンのような存在です。早速、実装していきましょう。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a")
parser.add_argument("abc")
parser.add_argument("jkl")

args = parser.parse_args()

print(f"a = {args.a}")
print(f"abc = {args.abc}")
print(f"jkl = {args.jkl}")

先ほど紹介したこのコードでターミナルに以下の様に -h を付けます。

python arg.py -h

すると、

usage: arg.py [-h] a abc jkl

positional arguments:
  a
  abc
  jkl

optional arguments:
  -h, --help  show this help message and exit

この様に、a, abc, jkl に対する引数が必要だよということを教えてくれます。さらに、次の様に arg.py のコードに help=を加えると

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a",help="引数aが足りないよ")
parser.add_argument("abc",help="引数abcが足りないよ")
parser.add_argument("jkl",help="引数jklが足りないよ")

args = parser.parse_args()

print(f"a = {args.a}")
print(f"abc = {args.abc}")
print(f"jkl = {args.jkl}")

結果は

usage: arg.py [-h] a abc jkl

positional arguments:
  a           引数aが足りないよ
  abc         引数abcが足りないよ
  jkl         引数jklが足りないよ

optional arguments:
  -h, --help  show this help message and exit

この様に引数に関して詳細な説明を書くことができ、他に使う人が使いやすくなることがあります。これが1つ目のオプションです。次に紹介するのが、type です。

オプション② ~type~

筆者

/筆者は車好きのため、Honda civic typeRの画像を入れてしまいました

type オプションはその名の通り、int 型や str 型など型を指定することができます。これも具体例を見ていきましょう。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a", help="引数aが足りないよ", type=str)
parser.add_argument("abc", help="引数abcが足りないよ", type=int)
parser.add_argument("jkl", help="引数jklが足りないよ", type=int)

args = parser.parse_args()

print(f"a = {args.a}")
print(f"abc = {args.abc}")
print(f"jkl = {args.jkl}")

help の後に type を定義し、a には str 型を、abc, jkl には int 型を指定しました。そのため、次のコードをコマンドライン上に打つと、

python arg.py 引数a 15 引数jkl
a = 引数a
abc = 15
jkl = 99

このように、a には引数a が、abc, jkl にはそれぞれ 15 と 99 を代入することができました!!

では最後に default の説明をしたいと思います。

オプション③ ~default~

default は引数を指定しなかった時に default の引数がそのコードの引数になるために設定するものです。例を見ましょう。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a", help="引数aが足りないよ", type=str)
parser.add_argument("--abc", help="引数abcが足りないよ", type=int, default=17)
parser.add_argument("--jkl", help="引数jklが足りないよ", type=int, default=85)

args = parser.parse_args()

print(f"a = {args.a}")
print(f"abc = {args.abc}")
print(f"jkl = {args.jkl}")

parser.add_argument の2つ目と3つ目に注目してほしいです。ここでは引数に — を付けて、最後に default= として17,85 の値を設定しました。この — をつけると、— を付けた引数(今回だとabc と jkl )はコマンドライン上で指定しなくてもいいよ。ということを示しています。その代わり、default を設定しとくよ。みたいな感じです。

python arg.py 引数a

このコードをターミナル上で実行すると

a = 引数a
abc = 17
jkl = 85

となり、 a についてはコマンドライン上で設定した引数が、abc と jkl については引数を設定していないため、default の17と85という数字が代入されました。ちなみに — を付けたとしても引数をコマンドライン上で入力することは可能でそのときはコマンドライン上で設定した引数が反映されます

python arg.py 引数a --abc 84

そのときはこの様に –abc を付けた後に自分が入れたい引数を入力すると

a = 引数a
abc = 84
jkl = 85

このように代入することができます!!

まとめ (Conclusion)

今回は簡単に argparse の使い方についてまとめてみました。 argparse と聞くと難しく感じてしまいますが、引数を設定するライブラリと考えると分かりやすいと思います。今回は3つのオプションを紹介しましたが、他にも多くのオプションが公式サイトや以下のリンクのブログにあるでぜひ、参考にしてみてください!!

参考文献 (Reference)

https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0

https://docs.python.org/ja/3/library/argparse.html

お問い合わせ