argparse:可选参数,不同的位置参数不同
Argparse: Optional arguments, distinct for different positional arguments
我想要位置参数和可选参数。好像 my_command foo --version=0.1 baz bar --version=0.2
。这应该解析为一个参数列表 [foo, bar, baz]
,其中 2 个设置为 version
。
没有可选参数,设置 nargs=*
或 nargs=+
很简单,但我正在努力为位置参数提供可选参数。 argparse 甚至可能吗?
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
参数收集未解析的字符串。
通常可选项可以以任何顺序出现。它们仅由 -
标志值标识。位置必须以特定的顺序出现,但可选的可能出现在不同的位置之间。另请注意,在用法显示中,首先列出可选值,然后是位置值。
usage: PROG [-h] [--version Version] [--other OTHER] FOO BAR BAZ
subparsers
是 link 带有一个或多个 optionals
的位置参数的唯一方法。但通常一个解析器只允许有一个 subparsers 参数。
没有子解析器,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
识别为 'missing' 版本值。
关于组 - 参数组只影响帮助显示。它们与解析无关。
您如何向您的用户(或 6 个月后的您自己)解释如何使用此界面?用法和帮助是什么样的?将设计更改为更易于实现和解释的设计可能会更简单。
这是一个处理您的示例输入的脚本。
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
参数中。这就像 +
一样,因为它至少需要一个字符串,但它也收集看起来像可选的字符串。我需要添加一个 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
字符串以及其他所有内容的方式。
因此可以根据需要解析参数字符串。但我不确定代码的复杂性是否值得。代码可能也很脆弱,针对这组特定的参数量身定制,并且只有几个变体。
我想要位置参数和可选参数。好像 my_command foo --version=0.1 baz bar --version=0.2
。这应该解析为一个参数列表 [foo, bar, baz]
,其中 2 个设置为 version
。
没有可选参数,设置 nargs=*
或 nargs=+
很简单,但我正在努力为位置参数提供可选参数。 argparse 甚至可能吗?
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
参数收集未解析的字符串。
通常可选项可以以任何顺序出现。它们仅由 -
标志值标识。位置必须以特定的顺序出现,但可选的可能出现在不同的位置之间。另请注意,在用法显示中,首先列出可选值,然后是位置值。
usage: PROG [-h] [--version Version] [--other OTHER] FOO BAR BAZ
subparsers
是 link 带有一个或多个 optionals
的位置参数的唯一方法。但通常一个解析器只允许有一个 subparsers 参数。
没有子解析器,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
识别为 'missing' 版本值。
关于组 - 参数组只影响帮助显示。它们与解析无关。
您如何向您的用户(或 6 个月后的您自己)解释如何使用此界面?用法和帮助是什么样的?将设计更改为更易于实现和解释的设计可能会更简单。
这是一个处理您的示例输入的脚本。
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
参数中。这就像 +
一样,因为它至少需要一个字符串,但它也收集看起来像可选的字符串。我需要添加一个 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
字符串以及其他所有内容的方式。
因此可以根据需要解析参数字符串。但我不确定代码的复杂性是否值得。代码可能也很脆弱,针对这组特定的参数量身定制,并且只有几个变体。