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
参数取决于 stuff
和 property
。我可以让解析器不知道--limit
,只解析已知的参数
args, unknown = parser.parse_known_args(['--limit', 's:100', 'something', '123'])
并将unknown
传递给第二个解析器,它可以根据stuff
和property
的值进行操作,但是我无法在python tool.py --help
的输出中包含第二个解析器的帮助,或者我可以?
【问题讨论】:
【参考方案1】:您可以给第一个解析器一个自定义的usage
参数,其中包含所有参数。您可以手动编写,或者从包含所有参数的(未使用的)解析器中获取它。
astr = parser.format_usage()
获取使用字符串
parser = ArgumentParser(usage=astr,...)
将它传递给一个新的解析器。您可能需要稍微修改一下astr
。
包含额外的help
行会比较棘手。您可以将它们添加到description
或epilog
。
解析参数的顺序由它们在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
自定义操作可以查看 stuff
和 property
的值,但如果后面出现这些字符串,这将无济于事。同样,stuff
操作可以查看和修改limit
属性,但后面的--limit
可以覆盖它。
如果您详细说明这些论点如何相互作用,我们可以为您提供更具体的想法。
另一个想法 - 使用一个解析器来处理帮助,并以最通用的方式处理 --limit
。然后使用第一个有用的值创建或修改一个新的解析器,并再次解析输入。同一个sys.argv
可以被多个解析器多次解析。解析中没有任何内容被破坏。
【讨论】:
以上是关于argparse:首先解析特定选项,同时在使用提示中显示所有选项的主要内容,如果未能解决你的问题,请参考以下文章