Python argparse:ArgumentDefaultsHelpFormatter与MetavarTypeHelpFormatter

Python argparse:ArgumentDefaultsHelpFormatter与MetavarTypeHelpFormatter,python,argparse,Python,Argparse,是否可以将argparse.ArgumentDefaultsHelpFormatter的功能与argparse.MetavarTypeHelpFormatter结合使用 在中有关于如何使用其中任何一个的示例,但不清楚如何创建结合了两者优点的帮助文本 例如,我希望如下所示: parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo', type=int, default=42, help='FOO!') par

是否可以将
argparse.ArgumentDefaultsHelpFormatter
的功能与
argparse.MetavarTypeHelpFormatter
结合使用

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

例如,我希望如下所示:

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)
制作如下内容:

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)

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

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)
AttributeError: 'NoneType' object has no attribute '__name__'
注意,我还必须为positional指定一个
类型
。没有这一点,我就犯了一个错误:

AttributeError: 'NoneType' object has no attribute '__name__'
有了这个需求,我怀疑
MetavarTypeHelpFormatter
没有多大用处。默认的“字符串”类型(无)将产生错误。这是一个方便的格式化程序类,可能会产生比它解决的问题更多的问题

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

子类化这两个类的替代方法是子类化它们的父类,并包括这两个子类更改的所有方法


添加:

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')
产生

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)
AttributeError: 'NoneType' object has no attribute '__name__'

这里定义的
MyFormatter
在我的Linux上不起作用,我得到:
../python3.6/argparse.py”,第688行,在位置返回操作.type的\u get\u default\u metavar\u中。\u name\uuuuuu属性错误:“NoneType”对象没有属性“\uuu name\uuuuuu”
我的位置参数确实有一个指定的类型(我把
type=str
).有什么想法吗?实际上,我还必须为所有可选参数指定
类型
。现在它可以工作了。谢谢您的帮助:)