Argparse:可选参数,对于不同的位置参数是不同的

2024-04-27 00:19:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个可选参数的位置参数。Smth likemy_command foo --version=0.1 baz bar --version=0.2。它应该解析为一个参数列表[foo, bar, baz],其中2个设置了version。在

没有可选参数,设置nargs=*nargs=+很简单,但是我很难为位置参数提供可选参数。argparse甚至可以吗?在


Tags: 列表参数fooversionargparsebarbazcommand
1条回答
网友
1楼 · 发布于 2024-04-27 00:19:19

Multiple invocation of the same subcommand in a single command line

它试图解析

$ python test.py executeBuild  name foobar1 executeBuild  name foobar2 ....

两个建议的解决方案都多次调用解析器。每个调用处理一个cmd name value对。一个先拆分sys.argv,另一个用argparse.REMAINDER参数收集未分析的字符串。在

通常情况下,选项可以按任何顺序出现。它们仅由-标志值标识。位置必须以特定的顺序出现,但选项可能出现在不同的位置之间。还要注意,在用法显示中,选项首先列出,然后是位置。在

^{pr2}$

subparsers是将位置参数与一个或多个optionals链接的唯一方法。但通常解析器只允许有一个subparser参数。在

如果没有子parser,append是从重复使用可选选项收集数据的唯一方法:

parser.add_argument(' version',action='append')
parser.add_argument('foo')
parser.add_argument('bar')
parser.add_argument('baz')

将处理您的输入字符串,生成一个命名空间,如:

namespace(version=['0.1','0.2'],foo='foo',bar='bar',baz='baz')

但是没有办法将baz标识为“缺少”版本值的那个。在

关于组-参数组只影响帮助显示。它们与解析无关。在

或者你现在该如何使用这个界面?使用和帮助是什么样子的?将设计更改为更易于实现和解释的设计可能更简单。在


下面是一个处理示例输入的脚本。在

import argparse
usage = 'PROG [cmd [ version VERSION]]*'
parser = argparse.ArgumentParser(usage=usage)
parser.add_argument('cmd')
parser.add_argument('-v',' version')
parser.add_argument('rest', nargs=argparse.PARSER)
parser.print_usage()
myargv = 'foo  version=0.1 baz bar  version=0.2'.split()
# myargv = sys.argv[1:] # in production

myargv += ['quit']  # end loop flag
args = argparse.Namespace(rest=myargv)
collect = argparse.Namespace(cmd=[])
while True:
    args = parser.parse_args(args.rest)
    collect.cmd += [(args.cmd, args.version)]
    print(args)
    if args.rest[0]=='quit':
        break
print collect

它反复解析一个位置的和可选的,将其余部分收集到argparse.PARSER参数中。这与+相似,因为它至少需要一个字符串,但它也会收集一些看起来像optional的字符串。我需要添加一个quit字符串,这样当没有任何东西可以填充这个PARSER参数时,它不会抛出错误。在

制作:

usage: PROG [cmd [ version VERSION]]*
Namespace(cmd='foo', rest=['baz', 'bar', ' version=0.2', 'quit'], version='0.1')
Namespace(cmd='baz', rest=['bar', ' version=0.2', 'quit'], version=None)
Namespace(cmd='bar', rest=['quit'], version='0.2')
Namespace(cmd=[('foo', '0.1'), ('baz', None), ('bar', '0.2')])

处理子参数的位置参数也使用这个nargs值。这就是它如何识别和收集cmd字符串以及其他所有内容。在

因此,可以像您想要的那样解析参数字符串。但我不确定代码的复杂性是否值得。代码可能也很脆弱,是为这组特定的参数而定制的,而且只是一些变体。在

相关问题 更多 >