2024-04-27 00:19:19 发布
网友
我想要一个可选参数的位置参数。Smth likemy_command foo --version=0.1 baz bar --version=0.2。它应该解析为一个参数列表[foo, bar, baz],其中2个设置了version。在
my_command foo --version=0.1 baz bar --version=0.2
[foo, bar, baz]
version
没有可选参数,设置nargs=*或nargs=+很简单,但是我很难为位置参数提供可选参数。argparse甚至可以吗?在
nargs=*
nargs=+
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参数收集未分析的字符串。在
cmd name value
sys.argv
argparse.REMAINDER
通常情况下,选项可以按任何顺序出现。它们仅由-标志值标识。位置必须以特定的顺序出现,但选项可能出现在不同的位置之间。还要注意,在用法显示中,选项首先列出,然后是位置。在
-
subparsers是将位置参数与一个或多个optionals链接的唯一方法。但通常解析器只允许有一个subparser参数。在
subparsers
optionals
如果没有子parser,append是从重复使用可选选项收集数据的唯一方法:
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标识为“缺少”版本值的那个。在
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参数时,它不会抛出错误。在
argparse.PARSER
+
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字符串以及其他所有内容。在
nargs
cmd
因此,可以像您想要的那样解析参数字符串。但我不确定代码的复杂性是否值得。代码可能也很脆弱,是为这组特定的参数而定制的,而且只是一些变体。在
Multiple invocation of the same subcommand in a single command line
它试图解析
两个建议的解决方案都多次调用解析器。每个调用处理一个
cmd name value
对。一个先拆分sys.argv
,另一个用argparse.REMAINDER
参数收集未分析的字符串。在通常情况下,选项可以按任何顺序出现。它们仅由
^{pr2}$-
标志值标识。位置必须以特定的顺序出现,但选项可能出现在不同的位置之间。还要注意,在用法显示中,选项首先列出,然后是位置。在subparsers
是将位置参数与一个或多个optionals
链接的唯一方法。但通常解析器只允许有一个subparser参数。在如果没有子parser,
append
是从重复使用可选选项收集数据的唯一方法:将处理您的输入字符串,生成一个命名空间,如:
但是没有办法将
baz
标识为“缺少”版本值的那个。在关于组-参数组只影响帮助显示。它们与解析无关。在
或者你现在该如何使用这个界面?使用和帮助是什么样子的?将设计更改为更易于实现和解释的设计可能更简单。在
下面是一个处理示例输入的脚本。在
它反复解析一个位置的和可选的,将其余部分收集到
argparse.PARSER
参数中。这与+
相似,因为它至少需要一个字符串,但它也会收集一些看起来像optional的字符串。我需要添加一个quit
字符串,这样当没有任何东西可以填充这个PARSER
参数时,它不会抛出错误。在制作:
处理子参数的位置参数也使用这个
nargs
值。这就是它如何识别和收集cmd
字符串以及其他所有内容。在因此,可以像您想要的那样解析参数字符串。但我不确定代码的复杂性是否值得。代码可能也很脆弱,是为这组特定的参数而定制的,而且只是一些变体。在
相关问题 更多 >
编程相关推荐