Pythonスクリプトの引数関連の処理をサポートしてくれる標準ライブラリとしてargparseというものがあります。argparseでは有効な引数をバリデーションチェックも加味して追加できます。
今回はargparseで「数値の有効範囲あり」の引数を指定する方法を記載します。
argparseの概要
argparseとは、コマンドラインオプションと引数の解析を行なってくれるPythonライブラリです。Python2.7から使用可能で標準ライブラリとして搭載されています(なので、pipをわざわざ使う必要がなく、他のユーザに頒布するときに「このライブラリ入れてね」と追加で記載しなくて済みます)
Python公式ドキュメント argparse
https://docs.python.jp/3/library/argparse.html
この手の解析を行なってくれるPythonライブラリはargparseの他には以下のものがあります。
- docopt.docopt
Pythonistaなら知ってるオプションパーサ
http://qiita.com/petitviolet/items/aad73a24f41315f78ee4
許容範囲のチェックを入れる
argparseを使って引数解析の処理を入れるには以下のように実装すればOKです。(以下は整数値オプション「-s」を追加。)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='LightsOut Solver')
parser.add_argument('-s', type=int, help='LightsOut Size')
ArgumentParser#add_argument
の引数type
にstringやintと指定すれば引数として指定された値がその型として扱うことができるかチェックしてくれます。
上記のような引数追加の条件として「許容範囲」を指定するためには、ArgumentParser#add_argument
の引数choice
に許容範囲を示す値を入れればOKです。
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='LightsOut Solver')
parser.add_argument('-s', type=int, choice=range(1,6), help='LightsOut Size')
しかし、このchoiceにベタに値を指定できるのは「配列表現できるもの」に限ります。つまり有限個の範囲しか絞り込めません。無限個の範囲(たとえば「2以上の整数」とか「0以上1以下の実数」とか)を指定するには、「範囲を指定する配列」でなく「許容される値かどうかを判定するfunction」を指定すればOKです。
以下に、「2以上の整数」を範囲として指定するサンプルコードを記載します。
class range_check(object):
def __init__(self, low_limit=None, high_limit=None, vtype="integer"):
self.min = low_limit
self.max = high_limit
self.type = vtype
def __contains__(self, val):
ret = True
if self.min is not None:
ret = ret and (val >= self.min)
if self.max is not None:
ret = ret and (val <= self.max)
return ret
def __iter__(self):
low = self.min
if low is None:
low = "-inf"
high = self.max
if high is None:
high = "+inf"
L1 = self.type
L2 = " {} <= x <= {}".format(low, high)
return iter((L1, L2))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='LightsOut Solver')
parser.add_argument('-s', type=int, choices=range_check(low_limit=2), help='LightsOut Size')
なお、このコードを使って組み上げたサンプルプロジェクトをいかに記載します。
https://github.com/LyricalMaestro/lightsout-solver-python
まとめ
チェック用のメソッドを駆使すれば、argparseを使って自由度の高いvalidation checkができます。素晴らしいスクリプト作成に活用してみてください。
参考文献
Python公式ドキュメント argparse
https://docs.python.jp/3/library/argparse.html
Pythonistaなら知ってるオプションパーサ
http://qiita.com/petitviolet/items/aad73a24f41315f78ee4