python argparse处理任意数字选项(如HEAD(1))

python argparse处理任意数字选项(如HEAD(1)),python,command-line-arguments,optional-parameters,argparse,Python,Command Line Arguments,Optional Parameters,Argparse,有没有办法欺骗argparse接受像HEAD(1)这样的任意数字参数 相当于 head -n 5 test.txt 我目前的方法是使用parse_known_args(),然后处理其余部分,但我希望有更优雅的东西。agrparse和optparse都不支持这一点。是的,有可能: #!/usr/bin/env python # coding: utf-8 from argparse import ArgumentParser parser = ArgumentParser(descripti

有没有办法欺骗
argparse
接受像
HEAD(1)
这样的任意数字参数

相当于

head -n 5 test.txt

我目前的方法是使用
parse_known_args()
,然后处理其余部分,但我希望有更优雅的东西。

agrparse和optparse都不支持这一点。

是的,有可能:

#!/usr/bin/env python
# coding: utf-8

from argparse import ArgumentParser

parser = ArgumentParser(description='Argparse with numeric arguments')
parser.add_argument('-0', action='store_true', help='null separator')
args = parser.parse_args()
print vars(args)['0']

作为使用
vars(args)[0]
的@vault答案的替代方法,您还可以使用
args.\uu dict\uuuu['0']

实际上,您可以使用Action类在argparse中实现head-like参数。下面是一个示例程序,它将接受“-n###”或“-##”参数并打印数字

from argparse import ArgumentParser, Action, SUPPRESS
class UpdateCount(Action):
    def __call__(self, parser, namespace, values, option_string=None):
        digit = option_string[1]
        increment = int(digit)
        previous = getattr(namespace, self.dest)
        if previous is None:
            previous = 0
        else:
            previous *= 10
        setattr(namespace, self.dest, previous + increment)

parser = ArgumentParser(description='parse -## type options')
group = parser.add_mutually_exclusive_group()
group.add_argument('-n', type=int, default=10, metavar='#',
                   help='specify a number (-# also works) (default=10)')
group.add_argument('-0', '-1', '-2', '-3', '-4', '-5', '-6', '-7', '-8', '-9',
                   dest='count', default=None, nargs=0, action=UpdateCount, help=SUPPRESS)

def main():
    args = parser.parse_args()
    if args.count is None:
        count = args.n
    else:
        count = args.count
    print(count)


if __name__ == '__main__':
    main()
下面是一些示例输出

$ ./argparse_number_option -h
usage: argparse_number_option [-h] [-n #]

parse -## type options

optional arguments:
  -h, --help  show this help message and exit
  -n #        specify a number (-# also works) (default=10)
$ ./argparse_number_option -n 123
123
$ ./argparse_number_option -123
123
$ ./argparse_number_option -123 -n 34
usage: argparse_number_option [-h] [-n #]
argparse_number_option: error: argument -n: not allowed with argument -0/-1/-2/-3/-4/-5/-6/-7/-8/-9
$ 

这是令人高兴的反常!不幸的是,它不能很好地与其他命令混合使用,例如,“-4h0”给出帮助消息,而不是关于使用非整数的错误,“-2-8”给出28,而不是错误或使用8或2中的一个。
$ ./argparse_number_option -h
usage: argparse_number_option [-h] [-n #]

parse -## type options

optional arguments:
  -h, --help  show this help message and exit
  -n #        specify a number (-# also works) (default=10)
$ ./argparse_number_option -n 123
123
$ ./argparse_number_option -123
123
$ ./argparse_number_option -123 -n 34
usage: argparse_number_option [-h] [-n #]
argparse_number_option: error: argument -n: not allowed with argument -0/-1/-2/-3/-4/-5/-6/-7/-8/-9
$