194

タイトルは、私が実現したいことをほぼ要約しています。

これが私が持っているものです。プログラムは正でない整数で爆発することはありませんが、正でない整数は基本的にナンセンスであることをユーザーに知らせたいと思います。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-g", "--games", type=int, default=162,
                    help="The number of games to simulate")
args = parser.parse_args()

そして出力:

python simulate_many.py -g 20
Setting up...
Playing games...
....................

負の出力:

python simulate_many.py -g -2
Setting up...
Playing games...

さて、明らかに、負であると判断する if を追加することもできますが、自動使用法の印刷を利用するために、それをレベルでif args.gamesトラップする方法があるかどうかに興味がありました。argparse

理想的には、次のようなものが出力されます。

python simulate_many.py -g a
usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE]
simulate_many.py: error: argument -g/--games: invalid int value: 'a'

そのようです:

python simulate_many.py -g -2
usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE]
simulate_many.py: error: argument -g/--games: invalid positive int value: '-2'

今のところ私はこれをやっています、そして私は幸せだと思います:

if args.games <= 0:
    parser.print_help()
    print "-g/--games: must be positive."
    sys.exit(1)
4

6 に答える 6

281

これは を利用して可能になるはずtypeです。これを決定する実際のメソッドを定義する必要があります。

def check_positive(value):
    ivalue = int(value)
    if ivalue <= 0:
        raise argparse.ArgumentTypeError("%s is an invalid positive int value" % value)
    return ivalue

parser = argparse.ArgumentParser(...)
parser.add_argument('foo', type=check_positive)

これは基本的に、 のドキュメントperfect_square関数の例にすぎません。argparse

于 2013-01-02T05:58:04.743 に答える
79

typeYuushiの回答のように、条件/チェックを処理するための推奨オプションになります。

特定のケースでは、choices上限もわかっている場合はパラメーターを使用することもできます。

parser.add_argument('foo', type=int, choices=xrange(5, 10))

注: Python 3.xrangeの代わりに使用します。xrange

于 2013-01-02T06:05:32.780 に答える
10

引数に予測可能な最大値と最小値がある場合、手早く汚い方法はchoices、範囲で使用することです

parser.add_argument('foo', type=int, choices=xrange(0, 1000))
于 2013-01-02T06:05:19.860 に答える
9

特に をサブクラス化する場合のより簡単な代替方法argparse.ArgumentParserは、メソッド内から検証を開始するparse_argsことです。

このようなサブクラスの内部:

def parse_args(self, args=None, namespace=None):
    """Parse and validate args."""
    namespace = super().parse_args(args, namespace)
    if namespace.games <= 0:
         raise self.error('The number of games must be a positive integer.')
    return namespace

この手法は、カスタム callable ほどクールではないかもしれませんが、機能します。


ArgumentParser.error(message):

このメソッドは、メッセージを含む使用法メッセージを標準エラーに出力し、ステータス コード 2 でプログラムを終了します。


クレジット:ジョナタンによる回答

于 2016-10-09T19:51:47.960 に答える