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
).有什么想法吗?实际上,我还必须为所有可选参数指定类型
。现在它可以工作了。谢谢您的帮助:)