如果我填充一个专有的相互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/?
答案 0 :(得分:0)
如果您不希望parser
按顺序列在group
中,为什么要将usage
参数放在optionals
参数的中间?由于usage
可以按任何顺序进行解析,parser.format_usage
是以任何特定顺序定义它们的唯一原因。
这是usage
生成usage
行的结果。它按照您定义它们的顺序列出参数,只进行一次修改 - 在选项后面列出了位置。只有当它们可以按照这个定义的顺序叠加时,它才包含互斥的组标记。
如果您的论坛包含一系列选项和一个位置(组中不能有多个位置),那么只有当该位置紧跟在期权之后才会标记该组。
有一个错误请求,可以将现有参数添加到新的互斥组。 http://bugs.python.org/issue10984。这很容易做到。但是,正确使用是很困难的。如果参数属于多个组,则不能在不重复参数的情况下显示这两个组。这促使我重写了使用格式化程序。在此备用版本中,每个组都已格式化,根据需要重复参数。
简而言之,更改此格式化行为需要重写用法代码。在修补之前,您必须决定编写自己的{{1}}行。这样,您就可以优先于定义顺序提供组优先顺序。
看看http://bugs.python.org/issue11588你是否想要在群组可以嵌套时包含格式使用的更艰巨的任务时遇到困难,并且包含除了&x; xor'之外的逻辑。 (例如相互包容的团体)。