Python argparse: Is there a way to specify a range in nargs?

前端 未结 1 990
小鲜肉
小鲜肉 2020-12-02 14:15

I have an optional argument that supports a list of arguments itself.

I mean, it should support:

  • -f 1 2
  • -f 1 2 3

but not:

相关标签:
1条回答
  • 2020-12-02 15:05

    You could do this with a custom action:

    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
    
    0 讨论(0)
提交回复
热议问题