2

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

方法一:

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

方法二:

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

Logically both are doing exactly the same, because there is a dict in filter.pythat translates "FOO_BAR_XXX" type from method 2 to appropriate options for method 1.

我想指定,给定:

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

groupB = (--type)

groupA 和 groupB 是:

  1. 互斥的,并且
  2. groupA 必须至少定义 start_regex

现在,我知道mutual_exclusive_group功能,但它仅适用于单个参数(而不是选项组)和sub-commands,但看起来我必须在 prog.py 之后有某种调度选项,比如“ git clone --help" 或 "git push --help"(这篇文章证明了这一点)

请注意,这样说并不优雅:

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

还是我错过了什么?

4

1 回答 1

0

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

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

我认为之后进行自己的测试是最好的选择。


其他几个选项:

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

一个'--regex', nargs=3, metavar=('begin','end','content')论据。这可能与--type. 您甚至可以根据需要指定组。

于 2013-11-14T16:13:12.180 回答