python - Python argparse 中的手动命令规范

标签 python argparse

一个例子会更好,考虑这个愚蠢的例子:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo', nargs='+', help='Spam egg')

parser.parse_args()

当我运行 ---help 时:

usage: foos.py [-h] [-f FOO [FOO ...]]

optional arguments:
  -h, --help            show this help message and exit
  -f FOO [FOO ...], --foo FOO [FOO ...]
                        Spam egg

因为我使用了 nargs ='+',所以我得到了 -f FOO [FOO ...] 和类似的 -foo FOO [FOO 。 ..],但我只想在 --help 中显示一个 FOO 即我想要:

usage: foos.py [-h] [-f FOO]

optional arguments:
  -h, --help            show this help message and exit
  -f FOO, --foo FOO
                        Spam egg

我看过argparse doc但找不到类似的东西。我该怎么做?

最佳答案

您可以实现自己的格式化程序:

import argparse

class MyFormatter(argparse.HelpFormatter):

    def _format_args(self, action, default_metavar):
        get_metavar = self._metavar_formatter(action, default_metavar)
        if action.nargs is None:
            result = '%s' % get_metavar(1)
        elif action.nargs == argparse.OPTIONAL:
            result = '[%s]' % get_metavar(1)
        elif action.nargs == argparse.ZERO_OR_MORE:
            result = '[%s [%s ...]]' % get_metavar(2)

        #let's customize this part
        elif action.nargs == argparse.ONE_OR_MORE:
            #result = '%s [%s ...]' % get_metavar(2)
            result = '%s' % get_metavar(1)

        elif action.nargs == argparse.REMAINDER:
            result = '...'
        elif action.nargs == argparse.PARSER:
            result = '%s ...' % get_metavar(1)
        else:
            formats = ['%s' for _ in range(action.nargs)]
            result = ' '.join(formats) % get_metavar(action.nargs)
        return result

parser = argparse.ArgumentParser(formatter_class = MyFormatter)

parser.add_argument('-f', '--foo', nargs='+', help='Spam egg')
parser.parse_args()

这会给出:

usage: test.py [-h] [-f FOO]

optional arguments:
  -h, --help         show this help message and exit
  -f FOO, --foo FOO  Spam egg

关于python - Python argparse 中的手动命令规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705102/

相关文章:

python - 如何处理密码中的@符号 - sqlalchemy

python - 如何使用 arg 解析器库打印参数传递文件的前 n 行

python - Argparse 在 `choice` 参数中间吃任意字符串

python-2.7 - Python argparse 不带字符 -

python - 扩展 django admin 提交操作

python - 在单独的线程中启动 flask 应用程序

python - python scikitlearn NearestNeighbors 和 KNeighbors 分类器有什么区别

python - 多项选择命令行参数

python - 使用 unittest discover 传递参数(对于 argparse)

python - 如何从使用多处理运行脚本的 python2 子进程获取输出?