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
参数必须如何处理取决于两个stuff
和property
。我可以做--limit
不明就里的解析器,与
args, unknown = parser.parse_known_args(['--limit', 's:100', 'something', '123'])
解析唯一已知的参数,并通过unknown
第二分析器可以根据stuff
和property
价值观行事,但我可以不包括第二解析器的帮助输出python tool.py --help
,或者我可以吗?
您可以为第一个解析器提供包含所有参数的自定义usage
参数。您可以手动编写该文件,或从包含所有参数的(未使用)解析器中读取该文件。
astr = parser.format_usage()
获取使用字符串
parser = ArgumentParser(usage=astr,...)
它传递到一个新的解析器。您可能需要编辑astr
。
包括额外的help
行将更棘手。您可以将它们添加到description
或epilog
。
参数解析的顺序取决于它们在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
自定义操作可能会查看stuff
和property
的值,但如果这些字符串出现在后面,则无效。同样,stuff
操作可能会查看并修改limit
属性,但后者可能会覆盖该属性。
如果你扩展这些参数如何相互作用,我们可以给你更具体的想法。
另一个想法 - 用一个解析器来处理的帮助,并且在最普通的方式处理--limit
。然后使用第一个有用的值创建或修改新的解析器,并再次解析输入。多个解析器可以多次解析相同的sys.argv
。解析中没有东西被破坏。