argparse:首先解析特定选项,同时在使用提示中显示所有选项

Posted

技术标签:

【中文标题】argparse:首先解析特定选项,同时在使用提示中显示所有选项【英文标题】:argparse: parse specific options first, while having all options shown in usage hint 【发布时间】:2016-02-22 21:48:42 【问题描述】:

我有一个应用程序,其选项处理部分取决于为其他选项提供的值,如

python tool.py --limit=s:100 stuff property

一个简单的参数解析器可能如下所示:

import argparse
parser=argparse.ArgumentParser()
parser.add_argument('--limit')
parser.add_argument('stuff')
parser.add_argument('property')
args = parser.parse_args(['--limit', 's:100', 'something', '123'])

但是,必须如何处理 --limit 参数取决于 stuffproperty。我可以让解析器不知道--limit,只解析已知的参数

args, unknown = parser.parse_known_args(['--limit', 's:100', 'something', '123'])

并将unknown 传递给第二个解析器,它可以根据stuffproperty 的值进行操作,但是我无法在python tool.py --help 的输出中包含第二个解析器的帮助,或者我可以?

【问题讨论】:

【参考方案1】:

您可以给第一个解析器一个自定义的usage 参数,其中包含所有参数。您可以手动编写,或者从包含所有参数的(未使用的)解析器中获取它。

 astr = parser.format_usage()

获取使用字符串

 parser = ArgumentParser(usage=astr,...)

将它传递给一个新的解析器。您可能需要稍微修改一下astr

包含额外的help 行会比较棘手。您可以将它们添加到descriptionepilog


解析参数的顺序由它们在sys.argv 中的顺序决定。解析器查找位置参数,然后是可选参数、更多位置参数、下一个可选参数等,直到字符串被使用。

就哲学而言,我更愿意将argparse 视为解析器,而不是“处理程序”。它的主要目的是弄清楚用户想要什么,如果他们想要一些意想不到的东西,它会提供有用的反馈。

参数之间的交互最好在解析后处理。可以实现与自定义 Action 类的交互,但该代码通常会变得更加复杂。

在您的示例中,--limit 首先出现,将 's:100' 放在命名空间中

具有默认值的初始命名空间:

namespace(limit=None, stuff=None, property=None)

解析后的命名空间--limit:

namespace(limit='s:100', stuff=None, property=None)

解析两个位置后的命名空间:

namespace(limit='s:100', stuff='something', property=123)

limit 自定义操作可以查看 stuffproperty 的值,但如果后面出现这些字符串,这将无济于事。同样,stuff 操作可以查看和修改limit 属性,但后面的--limit 可以覆盖它。

如果您详细说明这些论点如何相互作用,我们可以为您提供更具体的想法。


另一个想法 - 使用一个解析器来处理帮助,并以最通用的方式处理 --limit。然后使用第一个有用的值创建或修改一个新的解析器,并再次解析输入。同一个sys.argv 可以被多个解析器多次解析。解析中没有任何内容被破坏。

【讨论】:

以上是关于argparse:首先解析特定选项,同时在使用提示中显示所有选项的主要内容,如果未能解决你的问题,请参考以下文章

argparse - 命令行选项与参数解析

argparse 解析器:覆盖选项

python argparse模块解析命令行选项简单使用

argparse模块

Python argparse.ArgumentParser用法

python标准库之argparse