Python argparse选项arg使用nargs='';在子Parser中的位置arg之前 import argparse parser=argparse.ArgumentParser() parser.add_参数( “--可选”, 默认值=无, const='some-const', nargs='?', 帮助(可选) subparsers=parser.add_subparsers() subparser=subparser.add_解析器('subparser')) subparser.add_参数( “位置的”, help='positional') args=parser.parse_args() 打印参数 ./test.py——可选的opt子Parser位置 名称空间(可选='opt',positional='positional')
这会引发错误:Python argparse选项arg使用nargs='';在子Parser中的位置arg之前 import argparse parser=argparse.ArgumentParser() parser.add_参数( “--可选”, 默认值=无, const='some-const', nargs='?', 帮助(可选) subparsers=parser.add_subparsers() subparser=subparser.add_解析器('subparser')) subparser.add_参数( “位置的”, help='positional') args=parser.parse_args() 打印参数 ./test.py——可选的opt子Parser位置 名称空间(可选='opt',positional='positional'),python,argparse,Python,Argparse,这会引发错误: import argparse parser = argparse.ArgumentParser() parser.add_argument( '--optional', default=None, const='some-const', nargs='?', help='optional') subparsers = parser.add_subparsers() subparser = subparsers.add_parser(
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'--optional',
default=None,
const='some-const',
nargs='?',
help='optional')
subparsers = parser.add_subparsers()
subparser = subparsers.add_parser('subparser')
subparser.add_argument(
'positional',
help='positional')
args = parser.parse_args()
print args
./test.py --optional opt subparser positional
Namespace(optional='opt', positional='positional') <-- works as expected
./test.py --optional subparser positional
usage: test.py [-h] [--optional [OPTIONAL]] {subparser} ...
test.py: error: invalid choice: 'positional' (choose from 'subparser') <-- throws an error
Namespace(optional='some-const', positional='positional') <-- would expect to see this
因为subparser
不是可选的:
.test.py --optional
subparser
在第二个示例中被吃掉并用作可选项。我不明白为什么,除了argparse没有事先弄清楚subparser是subparser
这是我能做的最接近你描述的事情:
usage: subparser.py [-h] [--optional [OPTIONAL]] {subparser} ...
test.py: error: too few arguments
我想您已经发现了一个bug。在解析/test.py--optional foo bar
时,argparse看到一个可选字符串(以--开头),后跟两个参数字符串(否--)
因此,它首先处理——可选的。这是因为nargs是“贪婪的”,所以它使用foo
参数,产生:
import argparse
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument(
'--optional',
nargs='?',
default=None,
const='some-const',
help='optional')
sub_parser = argparse.ArgumentParser(parents=[parent_parser])
sub_parser.add_argument('--subparser', required=True)
args = sub_parser.parse_args()
print args
这使得bar
作为子命令参数使用
它不检查foo
是否是有效的子命令参数
同样的推理也适用于/test.py--optional subparser positional
为什么将--optional
定义为subparser的父级不能解决问题?无论如何,您必须调用子parser
,那么如果您调用——可选子parser POS
或子parser POS——可选的
,又有什么区别呢?我不太愿意把它称为“bug”,但是,在我阅读文档和玩游戏的过程中,它确实出乎我的意料:)不过,如果你能解决它的话…subparser POS——可选的,对于这段代码也不起作用。
Namespace('optional'='foo')