Python Argparse:在'--帮助';?

Python Argparse:在'--帮助';?,python,argparse,Python,Argparse,假设我有以下argparse代码段: diags.cmdln_parser.add_argument( '--scan-time', action = 'store', nargs = '?', type = int, default = 5, help = "Wait

假设我有以下argparse代码段:

diags.cmdln_parser.add_argument( '--scan-time',
                     action  = 'store',
                     nargs   = '?',
                     type    = int,
                     default = 5,
                     help    = "Wait SCAN-TIME seconds between status checks.")
当前,
--help
返回:

用法:connection\u check.py[-h]
[--版本][--扫描时间[扫描时间]]
测试连接的可靠性/正常运行时间。
可选参数:
-h、 --帮助显示此帮助消息并退出
--版本显示程序的版本号并退出
--扫描时间[扫描时间]
状态检查之间等待扫描时间秒。
我更喜欢这样的:

--扫描时间[扫描时间]
状态检查之间等待扫描时间秒。
(默认值=5)
偷看一下帮助格式化程序代码,发现选项有限。有没有一种聪明的方法可以让
argparse
以类似的方式打印
--扫描时间的默认值,或者我应该只是将
帮助
格式化程序子类化?

使用:

要引用文档,请执行以下操作:

另一个可用的格式化程序类,
ArgumentDefaultsHelpFormatter
,将添加关于每个参数的默认值的信息

请注意,这仅适用于定义了帮助文本的参数;如果参数没有
help
值,则没有可向其添加有关默认值信息的帮助消息

然后,扫描时间选项的精确输出变为:

  --scan-time [SCAN_TIME]
                        Wait SCAN-TIME seconds between status checks.
                        (default: 5)
'%(默认)s'
添加到帮助参数以控制显示内容

parser.add_argument("--type", default="toto", choices=["toto","titi"],
                              help = "type (default: %(default)s)")
注释

  • 它是
    %
    +括号中的默认值+格式字符(不要与我们在
    格式
    或f-string中找到的大括号
    {default}
    混淆)
  • 不要忘记在末尾为类型表示添加“说明符字符”(即字符串为
    s
    ,整数为
    d
    ,浮点数为
    f
    ,等等)
  • 您还可以添加常用的“printf”格式说明符(如浮点数、前导零等)

有关更多详细信息,请参阅。

包装类

这是迄今为止我发现的最可靠、最枯燥的方法,可以同时显示默认值和使用另一个格式化程序,如
argparse.RawTextHelpFormatter

#!/usr/bin/env python3

import argparse

class ArgumentParserWithDefaults(argparse.ArgumentParser):
    def add_argument(self, *args, help=None, default=None, **kwargs):
        if help is not None:
            kwargs['help'] = help
        if default is not None and args[0] != '-h':
            kwargs['default'] = default
            if help is not None:
                kwargs['help'] += ' Default: {}'.format(default)
        super().add_argument(*args, **kwargs)

parser = ArgumentParserWithDefaults(
    formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.add_argument('--no-default', help='''my help
for no-default''')
parser.add_argument('--no-help', default=101)

parser.print_help()
print()
print(parser.parse_args())
输出:

usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
               [--no-help NO_HELP]

optional arguments:
  -h, --help            show this help message and exit
  -a A                  my help
                        for a Default: 13
  -b B                  my help
                        for b Default: 42
  --no-default NO_DEFAULT
                        my help
                        for no-default
  --no-help NO_HELP

Namespace(a=13, b=42, no_default=None, no_help=101)
usage: a.py [-h] [-a A] [-b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A        my help
              for a (default: 13)
  -b B        my help
              for b (default: 42)
ArgumentDefaultsHelpFormatter
+
RawTextHelpFormatter
多重继承

多重继承只起作用,但它似乎不是公共API:

#!/usr/bin/env python3

import argparse

class RawTextArgumentDefaultsHelpFormatter(
        argparse.ArgumentDefaultsHelpFormatter,
        argparse.RawTextHelpFormatter
    ):
        pass

parser = argparse.ArgumentParser(
    formatter_class=RawTextArgumentDefaultsHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.print_help()
输出:

usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
               [--no-help NO_HELP]

optional arguments:
  -h, --help            show this help message and exit
  -a A                  my help
                        for a Default: 13
  -b B                  my help
                        for b Default: 42
  --no-default NO_DEFAULT
                        my help
                        for no-default
  --no-help NO_HELP

Namespace(a=13, b=42, no_default=None, no_help=101)
usage: a.py [-h] [-a A] [-b B]

optional arguments:
  -h, --help  show this help message and exit
  -a A        my help
              for a (default: 13)
  -b B        my help
              for b (default: 42)
它之所以有效,是因为我们可以从以下来源中看到:

  • RawTextHelpFormatter
    实现
    \u拆分\u行
  • ArgumentDefaultsHelpFormatter
    实现
    \u获取\u帮助\u字符串
所以我们可以猜测他们会很好地合作

但是,这似乎不是公共API,格式化程序类的方法也不是,因此我认为目前没有公共API方法来实现这一点
argparse
docstring表示:

此模块中的所有其他类都被视为实现细节。 (还要注意,HelpFormatter和RawDescriptionHelpFormatter只是 作为对象名被认为是公共的——格式化程序对象的API是 仍在考虑实施细节。)

另见:


在Python 3.6.5上测试。

能够在帮助输出中自动包含
default
值通常很有用,但只包含那些明确指定的值(使用
default=..
)。上述方法在这方面有一些缺点:

  • ArgumentDefaultsHelpFormatter
    为未明确指定默认值的每个参数打印
    (默认值:无)
    ,为“标志”(
    action='store\u true'
    )打印
    。这会使帮助输出变得混乱。为了避免这种情况,需要为每个这样的参数手动添加
    default=argparse.SUPPRESS

  • '%(默认)s'
    需要手动将其添加到所有参数“
    帮助”
    字符串中,我们确实希望在帮助中打印这些字符串

这两种方法最终都需要手动干预,只打印“正确”的默认值。 自动执行此操作的一种方法是增加
参数defaultshelpformatter
以忽略
None
s和
False
s默认值:

类显式DefaultShelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
def_get_help_字符串(self,action):
如果action.default为(无,False):
returnaction.help
返回super()。\u获取\u帮助\u字符串(操作)
使用它代替
ArgumentDefaultsHelpFormatter

parser=argparse.ArgumentParser(
formatter_class=ExplicitDefaultsHelpFormatter
)
这将仅打印帮助输出中显式设置的
默认值


注意:如果参数的默认值被显式设置为
None
False
,则该类的帮助中不会显示该参数;如果希望在帮助输出中添加该参数的
%(默认)s
字符串到
help

您可能感兴趣。我再也没有看过argparse了。@PauloScardine-内置到语言中是argparse的一个主要好处。@PauloScardine:将一个非标准库拉到我当前的项目中确实是一件痛苦的事情,但我确实喜欢docopt输出的外观。谢谢你的提示@JS。你说“把一个非标准的库放到我当前的项目中确实会很痛苦”真的吗?pypi有很多非常有用的库。在我的上下文中,很容易引入非标准库。“如果在你的环境中这很难,那真是太悲哀了。”@guettli:那个项目是为一个商业嵌入式项目设计的。你说得对,安装很简单。得到