python - argparse 用法如何在中间显示与 parser.add_argument() 互斥的选项?

标签 python argparse

如果我填充一个互斥的 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/

相关文章:

python - 评估在命令行上传递的公式

python - 如何使 argparse 参数中的多个选择成为默认值,但一个或多个选择是可选的?

python - 匹配两个部分匹配到另一个列表的字符串列表

python - 如何向自动生成的 Python Selenium 脚本添加参数

python - 未提供位置参数时打印帮助

python-2.7 - 传递 argparse 列表时导入 python 模块

python - 使用 importlib.import_module 时出现 ModuleNotFoundError

python - 如何使用 XmlHttpRequest 2.0 将 5 MB 文件上传到 App Engine BlobStore?

python - 异常值处理部分零值过多怎么办?

python - 分组 argparse 子解析器参数