9

有没有办法欺骗argparse接受任意数字参数,例如HEAD(1)

head -5 test.txt

相当于

head -n 5 test.txt

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

4

4 回答 4

4

agrparse 和 optparse 都不支持这一点。

于 2012-04-05T11:22:03.837 回答
1

是的,有可能:

#!/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']
于 2015-09-05T11:04:58.367 回答
0

实际上,您可以使用 Action 类在 argparse 中实现类似头的参数。这是一个示例程序,它将采用“-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
$ 
于 2020-02-21T17:28:35.057 回答
-2

作为@vault's answer的替代方法,vars(args)['0]您还可以使用args.__dict__['0']

于 2018-03-18T06:49:38.460 回答