首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由其他参数隐含的argparse子解析器

由其他参数隐含的argparse子解析器
EN

Stack Overflow用户
提问于 2016-12-13 00:24:59
回答 2查看 1.1K关注 0票数 1

定义子解析器通常是这样做的

代码语言:javascript
运行
复制
master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
parser = subparsers.add_parser('sub')
parser.add_argument('--subopt')

和子解析器将使用

代码语言:javascript
运行
复制
command sub --subopt

我正在实现一个调用多个转换器的包。如果我使用通常的子解析器方法,我将不得不这样做

代码语言:javascript
运行
复制
convert ext1_to_ext2 file.ext1 file.ext2 --args

这既重复又容易出错,因为用户可能会调用

代码语言:javascript
运行
复制
convert ext1_to_ext3 file.ext1 file.ext2 --args

我更希望从主解析器中自动确定子解析器,这样用户就可以使用命令

代码语言:javascript
运行
复制
convert file.ext1 file.ext2  EXTRA

argparse将从file.ext1file.ext2中确定子解析器ext1_to_ext2,并调用子解析器ext1_to_ext2来解析EXTRA。当然,这里的EXTRA是特定于子解析器的。

我尝试为每个转换器(add_argument_group)使用参数组,但参数组中的参数不能重叠,并且我从所有解析器获得了一个混乱的组合参数列表,因此使用子解析器似乎是可行的。

我尝试使用带有两个位置参数的parse_known_args,确定并使用适当的子解析器来解析其余的参数,但很难从帮助消息中为用户提供转换器及其参数的列表。

有没有办法做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2016-12-13 00:35:00

推断要使用的子解析器是很棘手的,因为它需要在检查以下每个参数时重新实现argparse本身使用的大量逻辑。

一种更简单的方法是使用subparser命令,该命令允许您对以下参数进行“类型检查”,以确保它们使用正确的参数。例如

代码语言:javascript
运行
复制
# This allows a file name ending with any of the given extensions,
# or allows "file.1" in place of "file.1.jpg"
def jpeg_file(s):
    for ext in ("jpg", "jpeg"):
        if s.endswith(ext) or os.path.exists("%s.%s" % (s, ext)):
            return s
    raise argparse.ArgumentTypeError()

def tiff_file(s):
    # similar to jpeg_file

master_parser = argparse.ArgumentParser()
subparsers = master_parser.add_subparsers()
jpg_to_tiff_parser = subparsers.add_parser('sub')
jpg_to_tiff_parser = parse.add_argument('jpg', type=jpg_file)
jpg_to_tiff_parser = parse.add_argument('tiff', type=tiff_file)
票数 1
EN

Stack Overflow用户

发布于 2017-11-03 01:06:29

在我看来,这给了你更多的控制权。它正朝着你所要求的方向发展。只需根据需要添加文件扩展名检查即可。

代码语言:javascript
运行
复制
#prog.py
topParser=argparse.ArgumentParser()

subParsers = topParser.add_subparsers(
    title='SubCommands', 
    description='Use "prog.py <subCommand> (-h | --help)" to learn more about each subcommand', 
    help='I can do stuff')

subParser1 = subParsers.add_parser('use1', help="Use1 does one thing")
subParser2 = subParsers.add_parser('use2', help='Use2 does another thing')

subParser1.add_argument(
    '-f','--first-arg-for-use1',
    help="A text file",
    required=True
    )

subParser1.add_argument(
    '-s','--second-arg-for-use1',
    help="An encoding",
    required=True
    )

subParser2.add_argument(
    '-f','--first-arg-for-use2',
    help="An image format",
    required=True
    )

args = topParser.parse_args()
print(args)

即使没有其他内容,它也展示了如何处理不同层的帮助文本。

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

https://stackoverflow.com/questions/41105192

复制
相关文章

相似问题

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