argparse:第一解析特定选项,同时具有在使用提示显示

argparse:第一解析特定选项,同时具有在使用提示显示

问题描述:

我有一个应用程序,它选择处理部分依赖于其他选项中给出的值的所有选项,如argparse:第一解析特定选项,同时具有在使用提示显示

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,或者我可以吗?

您可以为第一个解析器提供包含所有参数的自定义usage参数。您可以手动编写该文件,或从包含所有参数的(未使用)解析器中读取该文件。

astr = parser.format_usage() 

获取使用字符串

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

它传递到一个新的解析器。您可能需要编辑astr

包括额外的help行将更棘手。您可以将它们添加到descriptionepilog


参数解析的顺序取决于它们在sys.argv中的顺序。解析器查找位置参数,然后查找可选,更多位置,下一个可选等,直到字符串被消耗。

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

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

在您的例子--limit先发生,推杆的:100'在命名空间

初始命名空间的默认值:

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

名称空间解析--limit后:

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

命名空间后解析2个位置:

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

limit自定义操作可能会查看stuffproperty的值,但如果这些字符串出现在后面,则无效。同样,stuff操作可能会查看并修改limit属性,但后者可能会覆盖该属性。

如果你扩展这些参数如何相互作用,我们可以给你更具体的想法。


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