我有以下代码
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)和bug报告(比如br 1),但我似乎找不到方法。这是一个未解决的错误吗?我以为这是可以做到的,是不是错了。如果做不到这一点,有什么解决办法吗?
同样要澄清的是,从元组获得的
['abc', 'def']
必须传递给其他要处理的函数。乐意提供进一步的澄清和/或澄清任何歧义。
最佳答案
正如我在一篇评论中所写的,子parsers是一个位置参数。
用一个简单的位置来说明:
In [307]: parser = argparse.ArgumentParser()
In [308]: a1 = parser.add_argument('foo')
In [309]: parser.parse_known_args(['one','two'])
Out[309]: (Namespace(foo='one'), ['two'])
“one”分配给第一个位置现在给
foo
选择:In [310]: a1.choices = ['bar','test']
In [311]: parser.parse_known_args(['one','two'])
usage: ipython3 [-h] {bar,test}
ipython3: error: argument foo: invalid choice: 'one' (choose from 'bar', 'test')
它仍在尝试将第一个字符串分配给
foo
。因为它与choices
不匹配,所以会引发一个错误。In [312]: parser.parse_known_args(['bar','one','two'])
Out[312]: (Namespace(foo='bar'), ['one', 'two'])
字符串根据位置而不是值分配给位置。任何值检查(例如使用类型或选项)都在赋值后完成。
将
choices
更改为type
测试:In [313]: a1.choices = None
In [314]: a1.type = int
In [315]: parser.parse_known_args(['bar','one','two'])
usage: ipython3 [-h] foo
ipython3: error: argument foo: invalid int value: 'bar'
In [316]: parser.parse_known_args(['12','one','two'])
Out[316]: (Namespace(foo=12), ['one', 'two'])
关于python - argparse:存在子解析器时如何分离未知的(和可选的)args(子解析器也是可选的),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53593867/