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

时间:2015-11-20 11:55:47

标签: python parsing command-line-arguments argparse partial

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

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的值进行操作,但是我无法在{的输出中包含第二个解析器的帮助{1}},或者我可以吗?

1 个答案:

答案 0 :(得分:0)

您可以为第一个解析器提供包含所有参数的自定义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)
解析2个位置后的

命名空间:

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

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

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

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