10

argparse を使用してグループ間の Python 依存関係argparseに関連して使用すると、パーサーのいくつかのパーサー グループの引数部分があります。たとえば、次のようになります。

group_simulate.add_argument('-P',
                            help='simulate FC port down',
                            nargs=1,
                            metavar='fc_port_name',
                            dest='simulate')

選択肢を使用して、選択肢を次の構造のパラメーターのリストに制限する方法:

1:m:"number between 1 and 10":p:"number between 1 and 4"

範囲オプションを使用しようとしましたが、受け入れ可能な選択肢のリストを作成する方法が見つかりませんでした

例: 正当なパラメータ:

test.py -P 1:m:4:p:2

無効なパラメータ:

test.py -P 1:p:2
test.py -P abvds

助けてくれてありがとう!

4

2 に答える 2

21

argparse.ArgumentTypeError文字列が必要な形式と一致しない場合に発生するカスタム型を定義できます。

def SpecialString(v):
    fields = v.split(":")
    # Raise a value error for any part of the string
    # that doesn't match your specification. Make as many
    # checks as you need. I've only included a couple here
    # as examples.
    if len(fields) != 5:
        raise argparse.ArgumentTypeError("String must have 5 fields")
    elif not (1 <= int(fields[2]) <= 10):
        raise argparse.ArgumentTypeError("Field 3 must be between 1 and 10, inclusive")
    else:
        # If all the checks pass, just return the string as is
        return v

group_simulate.add_argument('-P',
                        type=SpecialString,
                        help='simulate FC port down',
                        nargs=1,
                        metavar='fc_port_name',
                        dest='simulate')

更新: 値を確認するための完全なカスタム タイプを次に示します。すべてのチェックは正規表現で行われますが、一部が間違っている場合でも一般的なエラー メッセージが 1 つだけ表示されます。

def SpecialString(v):
    import re  # Unless you've already imported re previously
    try:
        return re.match("^1:m:([1-9]|10):p:(1|2|3|4)$", v).group(0)
    except:
        raise argparse.ArgumentTypeError("String '%s' does not match required format"%(v,))
于 2013-02-05T16:15:30.483 に答える