3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

argparseの数値引数バリデーションチェックで無限個の許容範囲を指定する方法

Posted at

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」を追加。)

引数チェックsample.py
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です。

引数チェックsample2.py
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以上の整数」を範囲として指定するサンプルコードを記載します。

引数チェックsample3.py
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

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?