Argparse小组在

时间:2013-11-14 11:37:26

标签: python argparse

使用python的argparse模块我想通过两种方式传递参数:

方法1:

./filter.py filename --start_regex "^FOO" --end_regex "BAR$" --contains "XXX" --bunch_of_common_options

方法2:

./filter.py filename --type "FOO_BAR_XXX" --bunch_of_common_options

逻辑上两者都完全相同,因为filter.py中有一个dict,它将方法2中的“FOO_BAR_XXX”类型转换为方法1的适当选项。

我想指定,给定:

  

groupA =( - start_regex, - end_regex --contains)

     

groupB =( - type)

groupA和groupB是:

  1. 互斥,
  2. groupA必须至少有start_regex 定义
  3. 现在,我知道mutually_exclusive_group功能,但它仅适用于单个参数(不是选项组)和sub-commands,但看起来我必须要有某种功能prog.py之后的dispatch选项,如“git clone --help”,或“git push --help”(this post证明)

    请注意,说:

    并不优雅
    ./filter.py with_type filename --type TYPE1
    ./filter.py without_type filename --start_regex "^FOO" --end_regex "BAR$" --contains "XXX" 
    

    或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

groups不会以任何重要方式影响解析。常规argument groups只影响help格式(您可能只想为此目的定义此类组)。互斥组会影响使用格式(但您可以创建自己的自定义使用行),并在违反时发出错误消息。但你也可以在parse_args之后进行那种测试,甚至使用argparse.error来生成格式化的错误消息。您也可以在之后进行“相互包容”的测试。

有一个'python问题'探讨将一个参数放入多个互斥组。在这种情况下,您可以创建3个组,每个组对应一个A组参数,并在每个组中放置--type参数。这种添加很容易;格式化有意义的usage需要做更多的工作。请参阅链接的SO问题。

我认为以后做自己的测试是最好的选择。


其他几个选项:

编写自定义操作或操作。例如,'regex_end'操作可以在命名空间尚未具有'regex_begin'值或具有'type'值时进行对象。 'type'动作可以检查其格式,如果已经设置了其中一个,则对象。但是你将在post-parse_args案例中进行相同的测试。

'--regex', nargs=3, metavar=('begin','end','content')参数。这可能与--type互斥。您甚至可以根据需要指定组。