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
$