Python argparse 整数条件 (>=12) [重複] 質問する

Python argparse 整数条件 (>=12) [重複] 質問する

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

を使用してこの結果を取得する方法が見つかりませんargparse。ルールを特定の値に設定する方法はなく、選択肢 = ['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何らかのオプションを使用してこの結果を直接取得する方法があるのだろうか。

ベストアンサー1

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")

ArgumentTypeError注:よりも を発生させる方が適切な例外だと思いますArgumentError。ただし、ArgumentTypeErrorは によって public クラスとして文書化されていないargparseため、独自のコードで使用するのは適切ではない可能性があります。私が気に入っているオプションの 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")

おすすめ記事