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

Posted

技术标签:

【中文标题】python argparse 处理任意数字选项(如 HEAD(1))【英文标题】:python argparse to handle arbitrary numeric options (like HEAD(1)) 【发布时间】:2012-04-19 02:42:22 【问题描述】:

有没有办法欺骗argparse 接受HEAD(1) 等任意数字参数?

head -5 test.txt

等价于

head -n 5 test.txt

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

【问题讨论】:

【参考方案1】:

agrparse 和 optparse 都不支持。

【讨论】:

2021年还是这样吗? @RichardNeumann 我没有看到类似docs.python.org/3/library/argparse.html【参考方案2】:

是的,有可能:

#!/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']

【讨论】:

【参考方案3】:

作为@vault 使用vars(args)['0] 的答案的替代方案,您也可以使用args.__dict__['0']

【讨论】:

【参考方案4】:

实际上,您可以使用 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
$ 

【讨论】:

这太反常了!不幸的是,它不能与其他命令很好地混合,例如,“-4h0”给出帮助消息而不是关于使用非整数的错误,而“-2 -8”给出28而不是错误或使用一个8 或 2 个。

以上是关于python argparse 处理任意数字选项(如 HEAD(1))的主要内容,如果未能解决你的问题,请参考以下文章

使用 optparse 或 argparse 处理使用相同选项的多个参数

Python:正确处理子命令的全局选项的参数解析器

python 解析命令行选项

Python3 覆盖 argparse 错误

python库之argparse

如何使用 argparse 实现以下功能?