首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用nargs='?‘的arg选项arg子解析器中的位置arg之前

使用nargs='?‘的arg选项arg子解析器中的位置arg之前
EN

Stack Overflow用户
提问于 2012-12-18 01:26:43
回答 2查看 1.3K关注 0票数 3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

上面是我演示这个问题的最简单的测试代码。我想要一个可选的arg,用nargs=‘?在子解析器中的位置arg之前。我读到可以将原始解析器作为父解析器传递给子子解析器,但这并不能解决问题。在尝试时,我尝试将add_help=False和冲突_处理程序=“解析”添加到初始解析器声明中。有人能为我指出正确的方向吗?

谢谢你,斯科特

EN

回答 2

Stack Overflow用户

发布于 2013-08-14 18:57:17

解析./test.py --optional foo bar时,an解析会看到一个可选字符串(以--开头),后面跟着两个参数字符串(no -)

因此,它从处理--optional开始。它是一个“贪婪的?”,所以它消耗了foo参数,产生了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Namespace('optional'='foo')

这使得bar被作为子命令参数使用。

它不检查foo是否是有效的子命令参数。

同样的推理也适用于./test.py --optional subparser positional

票数 1
EN

Stack Overflow用户

发布于 2013-01-01 22:15:16

这会引发一个错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.test.py --optional

因为subparser不是可选的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
usage: subparser.py [-h] [--optional [OPTIONAL]] {subparser} ...
test.py: error: too few arguments

在您的第二个示例中,subparser被吞食并用作OPTIONAL。我不明白为什么,除了a解析器之外,没有事先确定子解析器是子解析器。

这是我能做的和你描述的最接近的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

我想你发现了一只虫子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13929846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文