【问题标题】:How have argparse usage show mutually exclusive options with parser.add_argument() in the middle?argparse 的用法如何在中间显示带有 parser.add_argument() 的互斥选项?
【发布时间】:2015-04-05 23:39:42
【问题描述】:

如果我填充了一个互斥的 argparse 组,然后 parser.add_argument(对于其他项目),则该用法将互斥组中的参数显示为互斥:

import argparse

parser1 = argparse.ArgumentParser()
group1 = parser1.add_mutually_exclusive_group()
group1.add_argument('--start')
group1.add_argument('--stop')
group1.add_argument('--restart')
parser1.add_argument('--os')
parser1.print_usage()

输出:

usage: arg_usage.py [-h] [--start START | --stop STOP | --restart RESTART] [--os OS]

但是,如果我在组中间向解析器添加一个非互斥参数,则使用输出不再反映某些参数互斥的事实:

import argparse

parser2 = argparse.ArgumentParser()
group2 = parser2.add_mutually_exclusive_group()
group2.add_argument('--start')
group2.add_argument('--stop')
parser2.add_argument('--os')
group2.add_argument('--restart')
parser2.print_usage()

输出:

usage: arg_usage.py [-h] [--start START] [--stop STOP] [--os OS]
                [--restart RESTART]

有没有什么方法可以在不手动提供使用字符串或重新排序调用的情况下解决这个问题?

附加说明 - 我发现在将混合类型添加到互斥组(位置和可选)时会出现同样的问题(用法不表示互斥选项)。

附加?:这些错误是否应该提交给http://bugs.python.org/

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    如果您不希望 usage 按顺序列出 parser 参数,为什么要将它们放在 group 参数的中间?由于optionals 可以按任何顺序解析,usage 是按任何特定顺序定义它们的唯一原因。

    这是parser.format_usage 如何生成usage 行的结果。它按照您定义它们的顺序列出参数,并进行一项修改 - 位置列在可选项之后。只有当它们可以覆盖在这个定义的顺序上时,它才包含互斥的组标记。

    如果您的组包含可选选项和位置选项的混合(一个组中不能有多个位置选项),那么只有当该位置选项紧跟在选项之后时,该组才会被标记。

    有一个错误请求,要求能够将现有参数添加到新的互斥组。 http://bugs.python.org/issue10984。这很容易做到。但是要正确使用是困难的。如果一个参数属于多个组,则不可能在不重复该参数的情况下显示两个组。这促使我重写了使用格式化程序。在这个替代版本中,每个组都经过格式化,并根据需要重复参数。

    简而言之,改变这种格式化行为需要对使用代码进行重大重写。在修补之前,您将不得不满足于编写自己的 usage 行。这样你就可以让组顺序优先于定义顺序。

    看看http://bugs.python.org/issue11588,当组可以嵌套并包含“异或”以外的逻辑(例如相互包含的组)时,您是否想对格式化使用的更艰巨任务感到困惑。

    【讨论】:

      猜你喜欢
      • 2014-07-29
      • 2018-08-18
      • 2012-03-11
      • 2021-12-20
      • 2011-06-09
      • 1970-01-01
      • 2013-03-16
      • 2018-02-04
      相关资源
      最近更新 更多