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__'
是否可以将 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__'