【发布时间】:2019-05-04 18:05:30
【问题描述】:
我有以下代码
parser = argparse.ArgumentParser(allow_abbrev=False, add_help=False)
parser.add_argument('--conf', nargs=1)
parser.add_argument('-h', '--help', nargs='?', const='generic')
parser.add_argument('-v', '--version', action="store_true")
subparsers = parser.add_subparsers()
subparsers.required = False
parser_start = subparsers.add_parser('start')
group1 = parser_start.add_mutually_exclusive_group()
group1.add_argument('--quiet', action="store_true")
group1.add_argument('-V', '--verbose', nargs="*")
# parser_console = subparsers.add_parser('console')
print(argv)
parsed_args = parser.parse_known_args(argv)
现在,当我将argv 传递为argv = ['abc', 'def'] 或argv = ['abc'] 时
我明白了
['abc', 'def']
usage: lbrynet [--conf CONF] [-h [HELP]] [-v] {start} ...
lbrynet: error: invalid choice: 'abc' (choose from 'start')
我期待的是在未知参数的元组中获得['abc', 'def']。
我检查了很多 stackoverflow 的答案(例如 ans 1、ans 2、ans 3、ans 4)和错误报告(例如 br 1)和 lot,但我可以似乎没有找到办法。这是一个未解决的错误吗?我期望可以做到这一点是不是错了。如果无法做到这一点,是否有任何解决方法?
另外澄清一下,从元组中得到的['abc', 'def'] 必须传递给其他要处理的函数。
很高兴提供任何进一步的澄清和/或消除任何歧义。
【问题讨论】:
-
对于主解析器,
subparsers只是一个positional参数(带有一个特殊的action参数)。由于您没有定义任何其他位置,因此第一个非标志字符串分配给subparsers,它在choices测试中失败。argparse将字符串分配给位置,然后测试有效性,而不是相反。 -
另一种说法 - 仅仅因为
subparsers不是必需的,并不意味着这是一个标记的 (optional) 参数。这只是意味着如果您不提供字符串(在positional参数意义上),它不会抱怨。 -
['start','abc', 'def']应该将 2 个字符串放在extras中。这是因为调用了“开始”解析器,但不使用额外的字符串,并将它们传递回主解析器。 -
有没有办法不必提供
['start']并且仍然可以获得额外的参数。假设我“调用”程序的主要命令是X。这意味着我将以X abc def的身份运行该程序 -
我也确实查看了 argparse 的代码,我看到
abc, def首先被标记为 postionals(按模式“AA”),然后由start子解析器解析。但是不应该是因为abc和def都不匹配子命令start,所以它甚至不应该进入start子命令“空格”??