python - 自定义 argparse 帮助消息

标签 python python-3.x argparse

我编写了以下示例代码来演示我的问题。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0')
parser.parse_args()

这会产生以下帮助消息。

$ python foo.py --help
usage: foo.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --version  show program's version number and exit

我想自定义此帮助输出,使其将所有短语和句子大写,并在句子后面加上句点。换句话说,我希望像这样生成帮助消息。

$ python foo.py --help
Usage: foo.py [-h] [-v]

Optional arguments:
  -h, --help     Show this help message and exit.
  -v, --version  Show program's version number and exit.

这是我可以使用 argparse API 控制的东西吗?如果是这样,怎么做?您能否提供一个小例子来说明如何做到这一点?

最佳答案

首先:将这些短语大写违背惯例,而 argparse 并不能真正帮助您轻松更改这些字符串。这里有三类不同的字符串:来自帮助格式化程序的样板文本、部分标题和每个特定选项的帮助文本。所有这些字符串都是可本地化的;您可以通过 gettext() module support 为所有这些字符串提供“大写”翻译。 .也就是说,如果您有足够的决心和read the source code a little,您可以访问并替换所有这些字符串。 .

version Action 包含默认的help 文本,但您可以通过设置help 参数来提供自己的文本。这同样适用于 help Action ;如果您设置 add_help argument False 您可以手动添加该操作:

parser = argparse.ArgumentParser(add_help=False)

parser.add_argument('-v', '--version', action='version',
                    version='%(prog)s 1.0', help="Show program's version number and exit.")
parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
                    help='Show this help message and exit.')

接下来,可选参数消息是一个组标题;每个解析器都有两个默认组,一个用于位置参数,另一个用于可选。您可以通过 _positionals_optionals 属性来访问它们,这两个属性都具有 title 属性:

parser._positionals.title = 'Positional arguments'
parser._optionals.title = 'Optional arguments'

警告,通过访问以下划线开头的名称,您将冒险进入模块的未记录私有(private) API,并且您的代码可能会在未来的更新中中断。

最后,要更改 usage 字符串,您必须继承帮助格式化程序;将子类作为 formatter_class argument :

class CapitalisedHelpFormatter(argparse.HelpFormatter):
    def add_usage(self, usage, actions, groups, prefix=None):
        if prefix is None:
            prefix = 'Usage: '
        return super(CapitalisedHelpFormatter, self).add_usage(
            usage, actions, groups, prefix)

parser = argparse.ArgumentParser(formatter_class=CapitalisedHelpFormatter)

演示,将所有这些放在一起:

>>> import argparse
>>> class CapitalisedHelpFormatter(argparse.HelpFormatter):
...     def add_usage(self, usage, actions, groups, prefix=None):
...         if prefix is None:
...             prefix = 'Usage: '
...         return super(CapitalisedHelpFormatter, self).add_usage(
...             usage, actions, groups, prefix)
...
>>> parser = argparse.ArgumentParser(add_help=False, formatter_class=CapitalisedHelpFormatter)
>>> parser._positionals.title = 'Positional arguments'
>>> parser._optionals.title = 'Optional arguments'
>>> parser.add_argument('-v', '--version', action='version',
...                     version='%(prog)s 1.0', help="Show program's version number and exit.")
_VersionAction(option_strings=['-v', '--version'], dest='version', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help="Show program's version number and exit.", metavar=None)
>>> parser.add_argument('-h', '--help', action='help', default=argparse.SUPPRESS,
...                     help='Show this help message and exit.')
_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='Show this help message and exit.', metavar=None)
>>> print(parser.format_help())
Usage: [-v] [-h]

Optional arguments:
  -v, --version  Show program's version number and exit.
  -h, --help     Show this help message and exit.

关于python - 自定义 argparse 帮助消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35847084/

相关文章:

python - 无法从另一个线程停止计时器(带有nidaqmx-python和回调的简短示例)

python - 我们可以在条件下进行分配吗?

python - 二进制搜索功能

python - 如何添加可选或一次参数?

python - argparse "compulsory"可选参数

python - 帮助输出中的 Argparse 子命令顺序

python - 使用 SGD 的多项 Logistic Softmax 回归

python-3.x - 带有上下文管理器 "cannot schedule new futures after shutdown"的 ThreadPoolExecutor

python - 找出 _ast 模块的元素,该模块在 ast.py 中导入

python - 从 Viber 机器人向订阅用户发送消息