【问题标题】:Argparse groups inargparse 组
【发布时间】:2013-11-27 09:41:53
【问题描述】:

使用 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.py that 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 定义

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

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

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

还是我错过了什么?

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    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 互斥。您甚至可以根据需要指定组。

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 2017-12-11
      • 2021-12-20
      • 2019-11-17
      • 2014-02-12
      • 2015-11-08
      • 2016-12-27
      • 1970-01-01
      相关资源
      最近更新 更多