Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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')