argparse:ArgumentDefaultsHelpFormatter 和 MetavarTypeHelpFormatter

argparse: ArgumentDefaultsHelpFormatter with MetavarTypeHelpFormatter

是否可以将 argparse.ArgumentDefaultsHelpFormatter 的功能与 argparse.MetavarTypeHelpFormatter 结合起来?

docs 中有关于如何使用其中任何一种的示例,但不清楚如何创建结合两者优点的帮助文本?

例如,我想要如下内容:

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', type=int, default=42, help='FOO!')
parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')

生成如下内容:

usage: PROG [-h] [--foo int] [float [float ...]]

positional arguments:
 float         BAR! (default: [1, 2, 3])

optional arguments:
 -h, --help  show this help message and exit
 --foo int   FOO! (default: 42)

理论上,您可以定义一个新的格式化程序 class,它是其他两个 class 的子class。 (我可以在开发人员建议的地方找到 bug/issue。)这是否适用于这对需要在代码中进行测试或检查。基本上我们需要看这2个class改的方法是否兼容。

import argparse
class MyFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.MetavarTypeHelpFormatter):
    pass
parser = argparse.ArgumentParser(prog='PROG', formatter_class=MyFormatter)
parser.add_argument('--foo', type=float, default=42, help='FOO!')
parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!', type=int)
parser.print_help()

产生

2035:~/mypy$ python3.5 stack41195224.py 
usage: PROG [-h] [--foo float] [int [int ...]]

positional arguments:
  int          BAR! (default: [1, 2, 3])

optional arguments:
  -h, --help   show this help message and exit
  --foo float  FOO! (default: 42)

请注意,我还必须为位置指定 type。没有它我得到一个错误:

AttributeError: 'NoneType' object has no attribute '__name__'

有了这个要求,我怀疑 MetavarTypeHelpFormatter 没有多大用处。默认的 'string' 类型 (None) 会产生错误。这是一个方便的格式化程序 class,可能会产生比它解决的问题更多的问题。

defaults 帮助格式化程序只是将“(默认值:%(默认值)s)”字符串添加到帮助字符串。你可以自己做。所以这只是一种方便class,并不是任何人都需要的

subclass这两个 classes 的替代方法是 subclass 它们的父级,并包括这两个 subclasses 的所有方法改变。


添加:

parser.add_argument('foobar', type=str)

显示

1039:~/mypy$ python3 stack41195224_1.py 
usage: PROG [-h] [--foo float] [int [int ...]] str

positional arguments:
  int          BAR! (default: [1, 2, 3])
  str

optional arguments:
  -h, --help   show this help message and exit
  --foo float  FOO! (default: 42)

仅使用

parser.add_argument('foobar')

产生

AttributeError: 'NoneType' object has no attribute '__name__'