さらに,オプショナル引数を利用するプログラムを作成しよう.たとえば op.py というプログラムを作成し,実行時に op.py 2 10 -o pow
のように引数を渡すと,2の10乗を計算して1024を出力し,op.py 2 10 -o mul
のように引数を渡すと,2*10を計算して20を出力する,また,オプショナル引数を省略した場合は和が計算されるというように,様々な演算を行うプログラムを作成します.
オプショナル引数を利用するには,下記プログラム (op.py) の1行目にあるように argparse
モジュールをインポートします.実行時のコマンドライン引数は argparse
モジュールによって解析され,その結果を変数に格納できます.また,実行時のヘルプ表示なども自動的に生成されます.なお,argparse の詳細は Python チュートリアルを確認すると良いでしょう.
下記のプログラム op.py では,2個の位置引数と1個のオプショナル引数を指定します.22行目からがメインの処理ですが,最初に get_args()
関数が実行され,コマンドライン引数を取り出す処理が行われる.10行目と11行目で整数型の2つの位置引数を取得しています.14行目では,計算方法を指定するオプショナル引数を取得します.このとき,オプショナル引数に指定できる演算方法(文字列)を列挙します.つまり,指定できる計算方法は add
(和: addition),sub
(差:subtraction),mul
(積:multiplication),div
(商:division),pow
(べき乗:power)です.
様々な演算を行うプログラム (op.py)
import argparse
"""
コマンドライン引数を取り出す処理を行う関数
"""
def get_args():
# オブジェクトを生成する
parser = argparse.ArgumentParser()
# 2つの位置引数を指定する
parser.add_argument("a", type=int, help="value of a")
parser.add_argument("b", type=int, help="value of b")
# 計算方法をオプショナル引数として指定する
parser.add_argument("-o", "--operation", choices=['add', 'sub', 'mul', 'div', 'pow'], help="Type of operation")
args = parser.parse_args()
return(args)
"""
ここからメイン
"""
args = get_args()
a = args.a
b = args.b
if args.operation:
operation = args.operation
else:
operation = 'add' # 省略時はデフォルトの add にする
# 計算処理と結果の表示
if operation == 'sub':
result = a - b
print(a, '-', b, '=', result)
elif operation == 'mul':
result = a * b
print(a, 'x', b, '=', result)
elif operation == 'div':
result = a / b
print(a, '/', b, '=', result)
elif operation == 'pow':
result = a ** b
print(a, '^', b, '=', result)
else:
result = a + b
print(a, '+', b, '=', result)
実際に上のコード (op.py) を実行してみよう.まず,コマンドライン引数を指定せずに実行すると,エラーとなるが,使用方法 (usage) が表示されます.-h
(ヘルプ)および -o
の2種類のオプショナル引数と a
,b
の2種類の位置引数があることがわかります.さらに,オプショナル引数 -o
には,add, sub, mul, div, pow のいずれかを指定できることもわかります.
Z:\Documents\python>python op.py ⏎
usage: op.py [-h] [-o {add,sub,mul,div,pow}] a b
op.py: error: the following arguments are required: a, b
ヘルプを見るオプショナル引数があることがわかったので,-h
オプションを指定してヘルプを見てみよう.より詳細に引数の設定方法とその意味を確認できます.
Z:\Documents\python>python op.py -h ⏎
usage: op.py [-h] [-o {add,sub,mul,div,pow}] a b
positional arguments:
a value of a
b value of b
optional arguments:
-h, --help show this help message and exit
-o {add,sub,mul,div,pow}, --operation {add,sub,mul,div,pow}
Type of operation
ヘルプを確認するためには --help
と指定しても良いでしょう.
Z:\Documents\python>python op.py --help ⏎
usage: op.py [-h] [-o {add,sub,mul,div,pow}] a b
positional arguments:
a value of a
b value of b
optional arguments:
-h, --help show this help message and exit
-o {add,sub,mul,div,pow}, --operation {add,sub,mul,div,pow}
Type of operation
オプショナル引数を省略して実行した場合は,和が計算されます.
Z:\Documents\python>python op.py 2 10 ⏎
2 + 10 = 12
オプショナル引数を指定して,和を計算します.
Z:\Documents\python>python op.py 2 10 -o add ⏎
2 + 10 = 12
同様に,様々なオプショナル引数を指定して計算してみます.
Z:\Documents\python>python op.py 2 10 -o add ⏎ 2 + 10 = 12 Z:\Documents\python>python op.py 2 10 -o sub ⏎ 2 - 10 = -8 Z:\Documents\python>python op.py 2 10 -o mul ⏎ 2 x 10 = 20 Z:\Documents\python>python op.py 2 10 -o div ⏎ 2 / 10 = 0.2 Z:\Documents\python>python op.py 2 10 -o pow ⏎ 2 ^ 10 = 1024
オプショナル引数は省略形 -o
以外にも --operation
のように省略せずに記述することができます.
Z:\Documents\python>python op.py 2 10 --operation pow ⏎
2 ^ 10 = 1024
オプショナル引数を省略形で指定する場合は -o
の直後にスペースが無くても良いでしょう.
Z:\Documents\python>python op.py 2 10 -opow ⏎
2 ^ 10 = 1024
省略せずに記述する場合は --operation
の直後にスペースが必要です.よって,次のような指定ではエラーになります.
Z:\Documents\python>python op.py 2 10 --operationpow ⏎
usage: op.py [-h] [-o {add,sub,mul,div,pow}] a b
op.py: error: unrecognized arguments: --operationpow
オプショナル引数は,位置引数の前に記述しても良いでしょう.
Z:\Documents\python>python op.py -o pow 2 10 ⏎
2 ^ 10 = 1024
プログラム (op.py) の10行目,11行目では,a
と b
の型に int
(整数)を指定しているので,実行時に引数の型が自動的にチェックされます.したがって,次のように引数 b
に実数を指定した場合はエラーを表示できます.
Z:\Documents\python>python op.py 2 3.14 -o add ⏎
usage: op.py [-h] [-o {add,sub,mul,div,pow}] a b
op.py: error: argument b: invalid int value: '3.14'
引数 a
と b
の型は int
(整数)であるので,もちろん0や負の値を入力することは可能です.
Z:\Documents\python>python op.py 2 0 -o add ⏎ 2 + 0 = 2 Z:\Documents\python>python op.py 2 -10 -o add ⏎ 2 + -10 = -8 Z:\Documents\python>python op.py 2 -10 -o pow ⏎ 2 ^ -10 = 0.0009765625
ただし,0 で割ることはできないので,商に関しては例外処理の記述を追加する必要があるでしょう.
Z:\Documents\python>python op.py 2 0 -o div ⏎
Traceback (most recent call last):
File "op.py", line 39, in <module>
result = a / b
ZeroDivisionError: division by zero