【问题标题】:How do I avoid the capital placeholders in python's argparse module?如何避免 python 的 argparse 模块中的大写占位符?
【发布时间】:2013-06-06 17:13:41
【问题描述】:

有一个问题询问它们来自哪里,接受的答案是一堆教程和源代码的链接。 Explanation for argparse python modul behaviour: Where do the capital placeholders come from?

这些对我都没有帮助,我想要么摆脱它们,要么知道它们的目的。

例如这样的一行:

parser.add_argument('-c', '--chunksize', type=int, help='chunk size in bits')

产生这样的垃圾:

optional arguments:
  -h, --help            show this help message and exit
  -c CHUNKSIZE, --chunksize CHUNKSIZE
                        chunk size in bits

如果我尝试使用空的元变量字符串:

parser.add_argument('-c', '--chunksize', metavar='', type=int, help='chunk size in bits')

逗号后面有个空格:

optional arguments:
  -h, --help            show this help message and exit
  -c , --chunksize      chunk size in bits

【问题讨论】:

  • 我认为argparse.SUPPRESS 可以解决问题,但显然不是......
  • 你想要的输出是什么? -c chunksize, --chunksize chunksize 而不是 -c CHUNKSIZE, --chunkesize CHUNKSIZE?然后metavar = ('chunksize') 会这样做。那个论点根本没有帮助热线? help=argparse.SUPPRESS
  • 对于它的价值,我认为默认行为更好——更明确哪些选项需要参数(以及多少)。当然,我不是在编写程序,所以我在这里的输入可能无关紧要(这很好)——我只是在表达我对此事的感受。
  • @Nisan.H -- 我认为 OP 正在寻找 -c, --chunksize ______ chunksize in bits
  • 另外,请查看 docs.python.org/dev/library/argparse.html#formatter-class 的 MetavarTypeHelpFormatter,如果这不起作用,您可以获取源代码并将您自己的格式化程序子类化,以按照您想要的方式进行格式化

标签: python argparse


【解决方案1】:
parser.add_argument('-c', '--chunksize', metavar='\b', type=int, help='chunk size in bits')

似乎有效

【讨论】:

  • 简洁的技巧,哈哈。我不敢相信这是正确的做法。
  • 你自己说的;这是一个黑客,所以不可能是正确的方法,哈哈
  • 这会打乱选项描述的缩进
【解决方案2】:

您可以使您的格式化程序类以任何您想要的方式格式化参数。这并不完全直截了当,但这是产生以下输出的输出(假设@mgilson 是正确的,假设您只想为一组命令名称显示一次元变量......否则只需指定一个实际的metavar='value' 和它将精确显示该文本。):

# without metavar specified:
-c, --chunksize CHUNKSIZE
                chunk size in bits
# with metavar specified:
-c, --chunksize some_metavar
                chunk size in bits

类的代码和复制两个输出:

import argparse
# 2.7-3.2
class SingleMetavarHelpFormatter(argparse.HelpFormatter):
    def _format_action_invocation(self, action):
        if not action.option_strings:
            metavar, = self._metavar_formatter(action, action.dest)(1)
            return metavar

        else:
            parts = []

            # if the Optional doesn't take a value, format is:
            #    -s, --long
            if action.nargs == 0:
                parts.extend(action.option_strings)

            # if the Optional takes a value, format is:
            #    -s ARGS, --long ARGS
            else:
                default = action.dest.upper()
                args_string = self._format_args(action, default)

                ## THIS IS THE PART REPLACED
                #~ for option_string in action.option_strings:
                    #~ parts.append('%s %s' % (option_string, args_string)) ### this is change
                ## /SECTION REPLACED

                ## NEW CODE:
                parts.extend(action.option_strings)
                parts[-1] += ' %s' % args_string
                ## /NEW CODE
            return ', '.join(parts)


parser = argparse.ArgumentParser(
    prog='PROG',
    formatter_class=SingleMetavarHelpFormatter
    )

parser.add_argument('-c', '--chunksize', type=int, help='no metavar specified')
parser.add_argument('-w', '--with_metavar', type=int, help='metavar specified', metavar='some_metavar')

parser.print_help()

编辑: 要完全不显示元变量,您可以将空字符串传递给元变量:

parser.add_argument('-e', '--with_empty_metavar', type=int, help='empty metavar specified', metavar='')

使用原始类和新类的区别在于短命令语法后缺少额外的空格字符。

#usage: PROG [-h] [-c CHUNKSIZE] [-w some_metavar] [-e]
#
#optional arguments:
#  -h, --help            show this help message and exit
#  -c CHUNKSIZE, --chunksize CHUNKSIZE
#                        no metavar specified
#  -w some_metavar, --with_metavar some_metavar
#                        metavar specified
#  -e, --with_empty_metavar
#                        empty metavar specified

【讨论】:

  • 但是我为什么要从这个元变量开始呢?如果我查看 Linux 命令行应用程序中的典型帮助消息,我看不到这个 metavar 行。
  • 如果您传递一个空字符串作为元变量,那么这就是将显示的内容。我将它包含在编辑中。
  • 谢谢,所以我可以编写自己的格式化程序来完成这项工作。我仍然不明白为什么这必须如此繁琐以及为什么它不是默认行为。
  • 没有任何特定背景来开发这个模块或 linux 命令行应用程序中的帮助消息标准,对我来说,一个带有参数的命令会显示一些占位符参数来表示,这似乎很自然它的位置(有时是类型)......不管它的价值是什么,这就是我如此喜欢 Python 的原因——改变这种内置行为以满足您自己的需要真的很容易。
【解决方案3】:

关于您关于大写 metavar用途的问题 - 文档说:

一个可选参数--foo后面应该跟一个命令行参数,这将被称为FOO

这是解释,但我不得不读了很多遍才意识到它只是意味着FOO 是一个提示提供参数,其中参数的值=FOO。所以使用一个比 foo 更有帮助的例子:

# --days DAYS   <-- from an imaginary help page
--days 365  # for a year; DAYS=365
--days 7    # for a week; DAYS=7 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2014-11-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2011-12-31
    相关资源
    最近更新 更多