36

引数のリスト自体をサポートするオプションの引数があります。

つまり、以下をサポートする必要があります。

  • -f 1 2
  • -f 1 2 3

だがしかし:

  • -f 1
  • -f 1 2 3 4

argparse内でこれを強制する方法はありますか?現在、nargs = "*"を使用しており、リストの長さを確認しています。

編集:要求に応じて、必要なのは、許容可能な数の引数の範囲を定義できることです。つまり、(例では)2つまたは3つの引数は正しいですが、1つまたは4つ、または2..3の範囲内にないものは正しくありません。

4

1 に答える 1

30

カスタムアクションでこれを行うことができます:

import argparse

def required_length(nmin,nmax):
    class RequiredLength(argparse.Action):
        def __call__(self, parser, args, values, option_string=None):
            if not nmin<=len(values)<=nmax:
                msg='argument "{f}" requires between {nmin} and {nmax} arguments'.format(
                    f=self.dest,nmin=nmin,nmax=nmax)
                raise argparse.ArgumentTypeError(msg)
            setattr(args, self.dest, values)
    return RequiredLength

parser=argparse.ArgumentParser(prog='PROG')
parser.add_argument('-f', nargs='+', action=required_length(2,3))

args=parser.parse_args('-f 1 2 3'.split())
print(args.f)
# ['1', '2', '3']

try:
    args=parser.parse_args('-f 1 2 3 4'.split())
    print(args)
except argparse.ArgumentTypeError as err:
    print(err)
# argument "f" requires between 2 and 3 arguments
于 2010-11-16T14:41:16.523 に答える