首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python argparser解析器重复子解析

Python argparser解析器重复子解析
EN

Stack Overflow用户
提问于 2013-10-01 11:10:31
回答 1查看 2.3K关注 0票数 6

我使用pythons(2.7.2) and解析(1.1)来解析命令行,我想要的是创建子解析器,并使多次输入子解析器命令成为可能。如下所示:

代码语言:javascript
运行
复制
./script.py version 1 --file 1 2 3 version 3 --file 4 5 6

创造这样的东西是可能的吗?因为现在,当我尝试使用结果中的这样的参数运行脚本时,名称为get:

代码语言:javascript
运行
复制
Namespace(file=['4', '5', '6'], n=[1])

它是一个版本号。所以我得到了第一个版本号和第二个文件列表,而不是文件列表和版本。

EN

回答 1

Stack Overflow用户

发布于 2013-10-01 15:55:48

对于主解析器来说,子解析器参数是一个位置,可以进行选择。但是,它还将所有剩余的参数字符串分配给子解析器。

我希望您的字符串解析如下:

代码语言:javascript
运行
复制
./script.py version 1 --file 1 2 3 version 3 --file 4 5 6

version被接受为子解析器名称。1被接受为位置参数n的值。(用于子解析器)。--file被接受为可选参数(由子解析器接受)。来自第二次调用的值覆盖来自第一次调用的值。我猜--filenargs='*'。如果是这样的话,第一个将['1','2','3','version','3']写入命名空间,而第二个则用['4','5','6']覆盖它。如果是nargs=3,我希望子解析器会阻塞第二个version,它会将其视为一个未知位置。

因此,基本要点是--一旦“version”子解析器获得了参数列表,它就不会松手,直到它已经解析了它所能做的一切。在本例中,它分析了两个--file事件。它不能处理的任何内容都会以“未知”的形式返回到主解析器,这通常会引发错误。

如果希望从重复选项中获得值,请使用附加操作。

代码语言:javascript
运行
复制
parser.add_argument('--foo',action='append', nargs=3)

import argparse
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='version')
spp = sp.add_parser('version')
spp.add_argument('n',nargs='*',type=int)
spp.add_argument('--file',nargs=3,action='append')
str = 'version 1 --file 1 2 3 version 3 --file 4 5 6'
print(parser.parse_known_args(str.split()))

产生

代码语言:javascript
运行
复制
(Namespace(file=[['1', '2', '3'], ['4', '5', '6']], n=[1], version='version'), ['version', '3'])

仍然只有一个对version子解析器的调用,但是所有的数据都存在。

另一种方法是嵌套子解析器。

代码语言:javascript
运行
复制
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='sub')
spp = sp.add_parser('version')
spp.add_argument('n',nargs=1,type=int)
spp.add_argument('--file',nargs=3)

sp = spp.add_subparsers(dest='sub1')
spp = sp.add_parser('version')
spp.add_argument('n1',nargs=1,type=int)
spp.add_argument('--file',dest='file1',nargs=3)

str = 'version 1 --file 1 2 3 version 3 --file 4 5 6'
print(parser.parse_args(str.split()))

请注意,我必须更改'dest‘,以避免过写值。这会产生

代码语言:javascript
运行
复制
Namespace(file=['1', '2', '3'], file1=['4', '5', '6'], n=[1], n1=[3], sub='version', sub1='version')
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19114652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档