argparseでコマンドライン引数を設定

#はじめに
chainerのサンプルプログラムを少し触ろうとしたところ, エポック数やバッチサイズなど様々な値をコマンドライン引数で指定できるような仕組みをになっており, それらがargparseというライブラリで構成されているようなので調べてみました. 

#パーサー作成
argparseを使用するためには, はじめにArgumentParserオブジェクトを作成する必要があります. ArgumentParserオブジェクトはコマンドラインに関するデータを保持します. 

```python
parser = argparse.ArgumentParser()
```
#引数の追加
add_argument()メソッドを呼び出し, ArgumentParserオブジェクトにコマンドラインの文字列をオブジェクトに変換するための情報を与えます. 
add_argument()メソッドの引数には以下があります. 

|引数|説明|
|:--------:|:--------:|
|name or flag|引数かオプション引数か指定|
|help|引数の説明|
|required|オプション引数の省略をするかどうか|
|type|引数の型|
|default|指定がない場合に設定される値|

####name or flag
位置引数かオプション引数かを指定します. 位置引数は関数に対して必須となる引数で, オプション引数はあってもなくても良い引数です. add_argumentメソッドの第１引数で指定します. オプション引数には「-」をつける必要があります. 「-」で省略した名称, 「--」で正式な名称を指定します. 

```python:test.py
# coding: utf-8
import argparse

# パーサー作成
parser = argparse.ArgumentParser()
#引数の設定
parser.add_argument('-n', '--number')
# 引数を解析
args = parser.parse_args()
```
```
$python test.py -h
usage: test.py [-h] [-n NUMBER]

optional arguments:
  -h, --help            show this help message and exit
  -n NUMBER, --number NUMBER
```
optional arguments に新たな引数が追加されています. 

####help
引数の説明を記述します. 実際に, さきほど追加した引数の説明を追加してみます. 

```python:test.py
# coding: utf-8
import argparse

# パーサー作成
parser = argparse.ArgumentParser()
#引数の設定
parser.add_argument('-n', '--number', help = 'This is description')
# 引数を解析
args = parser.parse_args()
```
```
$ python test.py -h
usage: test.py [-h] [-n NUMBER]

optional arguments:
  -h, --help            show this help message and exit
  -n NUMBER, --number NUMBER
                        This is description
```
「This is description」と説明が追加されているのが分かります. 

####required
オプション引数の省略するかどうかを指定します. 

```python:test.py
# coding: utf-8
import argparse

# パーサー作成
parser = argparse.ArgumentParser()
#引数の設定
parser.add_argument('-n', '--number', required = True)
# 引数を解析
args = parser.parse_args()

print(args.number)
```
```
$ python test.py
usage: test.py [-h] -n NUMBER
test.py: error: the following arguments are required: -n/--number
```
required をTrueに設定し, 引数を指定しなければエラーになります. 

```
$ python test.py -n 10
10
```
引数を設定すると, 無事実行されます. 

####type
```python:test.py
# coding: utf-8
import argparse

# パーサー作成
parser = argparse.ArgumentParser()
#引数の設定
parser.add_argument('-n', '--number')
# 引数を解析
args = parser.parse_args()

print(type(args.number))
```
```
$ python test.py -n 10
<class 'str'>
```
引数の型はデフォルトでは文字列となっています. 異なる型で扱いたい場合は, typeで型を指定します.  

```python:test.py
# coding: utf-8
import argparse

# パーサー作成
parser = argparse.ArgumentParser()
#引数の設定
parser.add_argument('-n', '--number', type = int)
# 引数を解析
args = parser.parse_args()

print(type(args.number))
```
```
$ python test.py -n 10
<class 'int'>
```
指定した型になっていることが確認できます. 

####default
コマンドラインにて指定がなかった場合には, defaultで設定された値を用いて使用します. 

```python:test.py
# coding: utf-8
import argparse

# パーサー作成
parser = argparse.ArgumentParser()
#引数の設定
parser.add_argument('-n', '--number', default = 5)
# 引数を解析
args = parser.parse_args()

print(args.number)
```
```
$ python test.py 
5
```
コマンドライン引数を指定しなければ, defaultの値が使用されているのが確認できます. 

#引数の解析
parse_args()メソッドで引数の解析をします. コマンドラインからの各引数を適切な型に変換して処理を実行します. 

```python
args = parser.parse_args()
```
#参考サイト
[その１](https://docs.python.org/ja/3/library/argparse.html)
[その２](https://www.sejuku.net/blog/23647)