ArgumentParserの使い方を簡単にまとめた

# はじめに
Pythonの実行時にコマンドライン引数を取りたいときは，**ArgumentParser** (argparse)を使うと便利です。
様々な形式で引数を指定することができます。

初めてargparseを使おうとして調べていた時にいろいろな記事を読みましたが，細かいオプションまで解説している記事が多く，やりたいことの方法がすぐに分からなかった記憶があります。
そこで必要最低限な内容に絞り，読んですぐに使えるような記事を書きたいと思います。


# ArgumentParserとは？
プログラム実行時にコマンドラインで引数を受け取る処理を簡単に実装できる標準ライブラリです。
ArgumentParserを使うと

```console
$ python program.py test.txt --alpha 0.01
```
のように，プログラムで処理したいファイル名や何かのパラメータなどを実行時に指定できます。

# つかいかた
## 基本形
大まかに
1. `argparse`をインポートする
2. parserを作る
3. 引数を設定する
4. 解析する
といった処理をプログラム冒頭で実行します。

```python:test.py
import argparse    # 1. argparseをインポート

parser = argparse.ArgumentParser(description='このプログラムの説明（なくてもよい）')    # 2. パーサを作る

# 3. parser.add_argumentで受け取る引数を追加していく
parser.add_argument('arg1', help='この引数の説明（なくてもよい）')    # 必須の引数を追加
parser.add_argument('arg2', help='foooo')
parser.add_argument('--arg3')    # オプション引数（指定しなくても良い引数）を追加
parser.add_argument('-a', '--arg4')   # よく使う引数なら省略形があると使う時に便利

args = parser.parse_args()    # 4. 引数を解析

print('arg1='+args.arg1)
print('arg2='+args.arg2)
print('arg3='+args.arg3)
print('arg4='+args.arg4)
```

実行例

```console
$ python test.py input.txt output.txt --arg3 11111 -a 22222
arg1=input.txt
arg2=output.txt
arg3=11111
arg4=22222
```

引数なんだっけ？ってなった時に`-h`または`--help`を指定して**ヘルプ表示**もできるようになります。

```console
$ python test.py -h
usage: test.py [-h] [--arg3 ARG3] [-a ARG4] arg1 arg2

このプログラムの説明（なくてもよい）

positional arguments:
  arg1                  この引数の説明（なくてもよい）
  arg2                  foooo

optional arguments:
  -h, --help            show this help message and exit
  --arg3 ARG3
  -a ARG4, --arg4 ARG4
```

### 必須引数
`add_argument`で引数名を`'arg'`のように普通に指定するとこれになります。
実行時に引数を指定する順番が決まっているので指定し忘れるとエラーになります。

上の例の`arg1`と`arg2`がそうです。

### オプション引数
引数名を`'-a'`とか`'--alpha'`のようにハイフン(`'-'`)を1～2個つけたものにするとこれになります。
ハイフンの数は，引数名が1文字のときは1つ，それ以上のときは2つ付けている（と思います）

実行時には指定してもしなくても良く（指定されなかった場合は`None`になる），指定する順番も自由です。

また，正式名称と略称（？）をつけられるのでよく使う引数なら両方あると便利です。

```python
parser.add_argument('-i', '--input')
```

こうすると実行時には`-i`と`--input`のどちらを使っても指定できます。
ただし**プログラム中では正式名称でしか参照できません。**
例：

```python
parser.add_argument('-i', '--input')
args = parser.parse_args()
print(args.input)    # OK
print(args.i)    # エラー
```

## 応用編
### デフォルト値を指定したい！
オプション引数で指定されなかった場合は`None`になりますが，デフォルト値を指定することもできます。

```python
parser.add_argument('--message', default='hello!')
```
上記の実行時に`--message`が指定されていない場合は`None`の代わりに`'hello!'`になります。

### 型指定したい！
コマンドライン引数で指定された値はデフォルトでは文字列型です。
→整数値や実数値を指定したい！

```python
parser.add_argument('--number', type=int)    # 整数値(int)
parser.add_argument('--alpha', type=float, default=0.01)    # 実数値(float)
```

このようにすると，指定された値は`int`や`float`に自動で変換されます。

また，`type`引数には文字列から所望の型に**変換する関数を渡せば良い**ので他にもいろいろなことができます。

例：ピリオド`'.'`区切りの数値を指定してリストで受け取りたい！

```python
tp = lambda x:list(map(int, x.split('.')))
parser.add_argument('--address', type=tp, help='IP address')

args = parser.parse_args()
print(args.address)
```

実行例

```console
$ python test.py --address 192.168.31.150
[192, 168, 31, 150]
```

### フラグとして使いたい
`add_argument`に`action`を指定するとフラグとして使えます。

```python
parser.add_argument('--flag', action='store_true')
args = parser.parse_args()
print(args.flag)
```

```console
$ python test.py
False
$ python test.py --flag
True
```

実行時に`--flag`が指定されていると`True`，そうでないときは`False`になります。
引数として具体的な値を指定するのではなく，その引数を指定するorしないことに意味を持たせたい時に使えます。

ちなみに`action='store_false'`とすると逆になります（指定したら`False`）

### 指定する内容を選択肢の中から選ばせたい！

```python
parser.add_argument('--fruit', choices=['apple', 'banana', 'orange'])
```

`choices`にリストを渡すと，引数の選択肢をその中にあるもののみに限定でき，それ以外を指定するとエラーになります。

ヘルプ（`--help`）で何を指定できるか確認できます。

### 複数個（不定）受け取りたい

```python
parser.add_argument('--colors', nargs='*')
args = parser.parse_args()
print(args.colors)
```

```console
$ python test.py --colors red green blue
['red', 'green', 'blue']
```

`nargs='*'`を指定すると可変長で複数個をリスト形式で受け取ることができます。
`'*'`の代わりに整数を指定すると固定長にもできます。

### オプション引数だけど必須指定にしたい
`required=True`を指定すると必須指定のオプション引数を作ることができます。
私は上記の[必須引数](#必須引数)だと順序を忘れるので，好きな順序で指定できるこちらをよく使います。

```python
parser.add_argument("-a", required=True)
args = parser.parse_args()
print(args.a)
```

```console
$ python test.py -a hoge
hoge
$ python test.py
usage: test.py [-h] -a A
test.py: error: argument -a is required
```

# おわりに
ここで紹介した以外にも様々な使い方があり，使いこなせば高度で柔軟な引数の解析が可能です。
[公式ドキュメント](https://docs.python.jp/3.6/library/argparse.html)や他の多くの記事で解説されているので調べてみると良いと思います。