我有一个应用程序,其选项处理部分取决于为其他选项提供的值,如
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
的值进行操作,但是我无法在{的输出中包含第二个解析器的帮助{1}},或者我可以吗?
答案 0 :(得分:0)
您可以为第一个解析器提供包含所有参数的自定义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)
解析2个位置后的命名空间:
namespace(limit='s:100', stuff='something', property=123)
limit
自定义操作可以查看stuff
和property
的值,但如果这些字符串出现,则无效。同样,stuff
操作可以查看并修改limit
属性,但后者--limit
可能会覆盖该属性。
如果你扩展这些论点如何相互作用,我们可以给你更具体的想法。
另一个想法 - 使用一个解析器来处理帮助,并以最一般的方式处理--limit
。然后使用第一个中的有用值创建或修改新的解析器,并再次解析输入。多个解析器可以多次解析相同的sys.argv
。解析时没有任何东西被破坏。