web-dev-qa-db-ja.com

Python argparse integer条件(> = 12)

argparseを使用して、引数が12以上であることを要求する必要があります。

argparseを使用してこの結果を取得する方法が見つかりません。ルールを特定の値に設定する方法はないようですが、choices = ['rock'、 'paper'、 'scissorsなどの受け入れられた値の完全なセットのみです。 ']。

私のコードは:

import sys, argparse

parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=int, help="target bandwidth >=12")
args = parser.parse_args()
if args.bandwidth and args.bandwidth < 12:
    print "ERROR: minimum bandwidth is 12"
    sys.exit(1)

argparseオプションを使用してこの結果を直接取得する方法があるのだろうか。

20
giuspen

1つの方法は、カスタムタイプを使用することです。

def bandwidth_type(x):
    x = int(x)
    if x < 12:
        raise argparse.ArgumentTypeError("Minimum bandwidth is 12")
    return x

parser.add_argument("-b", "--bandwidth", type=bandwidth_type, help="target bandwidth >= 12")

注:ArgumentTypeErrorArgumentErrorよりも発生するより正しい例外だと思います。ただし、ArgumentTypeErrorargparseによってパブリッククラスとして文書化されていないため、独自のコードで使用するのは正しくないと見なされる場合があります。私が好きなオプションの1つは、alecxeが彼の答えで行うようにargparse.errorを使用することですが、タイプ関数の代わりにカスタムアクションを使用して、パーサーオブジェクトにアクセスします。

より柔軟なオプションは、現在のパーサーと名前空間オブジェクトへのアクセスを提供するカスタムアクションです。

class BandwidthAction(argparse.Action):

    def __call__(self, parser, namespace, values, option_string=None):
        if values < 12:
            parser.error("Minimum bandwidth for {0} is 12".format(option_string))
            #raise argparse.ArgumentError("Minimum bandwidth is 12")

        setattr(namespace, self.dest, values)

parser.add_argument("-b", "--bandwidth", action=BandwidthAction, type=int,
                     help="target bandwidth >= 12")
32
chepner

説明で紹介したものを試してみることができます:

import sys, argparse

parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=int, choices=range(12,100))
args = parser.parse_args()

たとえば、このように、invalid choiceでエラー自体を発生させるそのArgparse

13
user1593705

カスタムタイプや個別の関数を作成せずに、パーサーエラーを呼び出すことができます。コード例を変更するだけで十分です。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bandwidth", type=int, help="target bandwidth >=12")
args = parser.parse_args()
if args.bandwidth and args.bandwidth < 12:
    parser.error("Minimum bandwidth is 12")

これにより、アプリケーションが終了し、パーサーエラーが表示されます。

$ python test.py --bandwidth 11 
usage: test.py [-h] [-b BANDWIDTH]
test.py: error: Minimum bandwidth is 12
11
jonatan

これはどう?

import sys, argparse

parser = argparse.ArgumentParser()
parser.add_argument(
    "-b", "--bandwidth", 
    type=lambda x: (int(x) > 11) and int(x) or sys.exit("Minimum bandwidth is 12"),
    help="target bandwidth >=12"
)

ただし、実際のコードでは試していません。または、@ jonatanが書いたように、sys.exitparser.errorに変更することもできます。

0
Zhenhua Zhang