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))的主要内容,如果未能解决你的问题,请参考以下文章