如果我填充一个互斥的 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]
但是,如果我在组中间向解析器添加一个非互斥参数,则用法输出不再反射(reflect)某些参数是互斥的事实:
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/吗? ?
最佳答案
如果您不想在 usage
中列出它们,为什么要将 parser
参数放在 group
参数的中间那个命令?由于 optionals
可以按任何顺序解析,usage
是按任何特定顺序定义它们的唯一原因。
这是 parser.format_usage
生成 usage
行的结果。它按照您定义参数的顺序列出参数,并进行了一项修改——位置参数列在可选参数之后。只有当它们可以覆盖在这个定义的顺序上时,它才包括相互排斥的组标记。
如果您的组包含可选值和位置值的混合(组中不能有多个位置值),那么只有当位置值紧跟在可选值之后时,该组才会被标记。
有一个错误请求,要求能够将现有参数添加到新的互斥组中。 http://bugs.python.org/issue10984 .这很容易做到。但是正确使用是很困难的。如果一个参数属于多个组,则不可能在不重复该参数的情况下显示这两个组。这促使我重写使用格式化程序。在这个替代版本中,每个组都经过格式化,根据需要重复参数。
简而言之,更改此格式化行为需要对使用代码进行重大重写。在打补丁之前,您将不得不满足于编写自己的 usage
行。这样您就可以让组顺序优先于定义顺序。
看http://bugs.python.org/issue11588当组可以嵌套并包含“异或”以外的逻辑(例如相互包含的组)时,您是否想对格式化使用的更艰巨任务感到困惑?
关于python - argparse 用法如何在中间显示与 parser.add_argument() 互斥的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355446/