ArgumentParserの備忘録

# はじめに
Python実行時、コマンドライン引数を受け取る際に利用する**ArgumentParser**の備忘録です。　内容は必要最低限です。

この内容に関する説明は以下の記事が分かりやすいです。
[【参考】ArgumentParserの使い方を簡単にまとめた](https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0)

## 公式ドキュメント
https://docs.python.org/ja/3/library/argparse.html

# 使い方
## ライブラリのインストール
※Pythonの標準ライブラリです。
```console
$ pip install argparse
```
## 簡単な使い方
```python:test_argparse.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--A')
args = parser.parse_args()
print(args)
print(args.A)
```
```console
$ python test_argparse.py --A a
Namespace(A='a')
a
```
## 他の便利なadd_argumentの使い方
```python:test_argparse.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--A')
parser.add_argument('--B', help = 'この引数の説明')
parser.add_argument('-c', '--C') # 省略系
parser.add_argument('--D', default='hello world')
parser.add_argument('--E', type=int) # 型指定

tp = lambda x : list(map(int, x.split('.')))
parser.add_argument('--F', type=tp) 
# 123.456.789 -> [123, 456, 789] のようにできる

parser.add_argument('--G', action='store_true') # フラグ
parser.add_argument('--H', choices=['A', 'B', 'C']) # N択

parser.add_argument('--I', nargs='*') # 複数個
parser.add_argument('--J', nargs=2)  # ちょうど2つの引数
parser.add_argument('--K', nargs='+')  # 1つ以上の引数
parser.add_argument('--L', nargs='?')  # 0または1つの引数

parser.add_argument("-M", required=True) # コマンドラインで必ず指定する

args = parser.parse_args()
print(args)
```
```console
$ python temp_parseargs.py --A test_A --H B -M test_M
Namespace(A='test_A', B=None, C=None, D='hello world', E=None, F=None, G=False, H='B', I=None, J=None, K=None, L=None, M='test_M')
```
## 他の便利な使い方
### コード内で属性を動的に変更・追加することができる
```python:test_argparse.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--A')
args = parser.parse_args()
print(args.A)
args.A = 'B' # args.Aを変更
args.B = 'A' #args.Bを追加
print(args.A, args.B)
```
```console
$ python test_argparse.py --A a
a
B A
```

### 複数のArgumentParserオブジェクトを組み合わせる
```python:test_argparse.py
import argparse

# ひとつめ, add_help=Falseとすることで競合を避ける
parser1 = argparse.ArgumentParser(add_help=False)
parser1.add_argument('--A')

# ふたつめ
parser2 = argparse.ArgumentParser(add_help=False)
parser2.add_argument('--B')

# 組み合わせる
combined_parser = argparse.ArgumentParser(
    parents=[parser1, parser2]
)

# さらに追加する
combined_parser.add_argument('--C')
args = combined_parser.parse_args()
print(args)

```
```console
$ python temp.py --A a --B b --C c
Namespace(A='a', B='b', C='c')
```
### グループ化して、可読性を高める
```python:test_argparse.py
import argparse
parser = argparse.ArgumentParser()
# ひとつめ
group1 = parser.add_argument_group("Group 1")
group1.add_argument('--A', help='Aの説明')
group1.add_argument('--B', help='Bの説明')
# ふたつめ
group2 = parser.add_argument_group("Group 2")
group2.add_argument('--C', help='Cの説明')

args = parser.parse_args()
print(args)
```
```console
$ python temp.py --A a --B b --C c
Namespace(A='a', B='b', C='c')
```
#### このように[-h], [--help]オプションで各引数の説明を出力することもできる
```console
$python temp.py -h
usage: temp.py [-h] [--A A] [--B B] [--C C]

options:
  -h, --help  show this help message and exit

Group 1:
  --A A       Aの説明
  --B B       Bの説明

Group 2:
  --C C       Cの説明
```
# おわりに
ここで紹介した内容はあくまで備忘録であり、最低限です。