我正在使用argparse接受命令行输入并生成帮助文本。我想将ArgumentDefaultsHelpFormatter
用作formatter_class
,但这会阻止我使用RawDescriptionHelpFormatter
,这样我就可以在自己的描述或结语中添加自定义格式。
除了自己编写代码以生成默认值的文本之外,还有一种明智的方法可以实现这一目的吗?根据argparse文档,ArgumentParser
的所有内部都被视为实现细节,而不是公共API,因此子类化不是一个有吸引力的选择。
答案 0 :(得分:34)
我刚尝试了一种多继承方法,它可以工作:
class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter):
pass
parser = argparse.ArgumentParser(description='test\ntest\ntest.',
epilog='test\ntest\ntest.',
formatter_class=CustomFormatter)
如果这些类的内部发生了变化,这可能会破坏。
答案 1 :(得分:1)
我不明白为什么子类化HelpFormatter
应该是一个问题。这并不是在混淆ArgumentParser
的内部。该文档包含自定义Action
和Type
类(或函数)的示例。如果需要,我会将'there are four such classes'
行作为邀请来编写自己的HelpFormatter。
提供的HelpFormatter
子类进行了非常简单的更改,只更改了一个函数。因此可以轻松复制或更改它们。
RawDescription
只是改变了:
def _fill_text(self, text, width, indent):
return ''.join(indent + line for line in text.splitlines(keepends=True))
理论上可以在不改变API的情况下进行更改,但这不太可能。
默认格式化程序只会更改:
def _get_help_string(self, action):
help = action.help
if '%(default)' not in action.help:
if action.default is not SUPPRESS:
defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
if action.option_strings or action.nargs in defaulting_nargs:
help += ' (default: %(default)s)'
return help
只需在所有参数帮助行中包含%(default)s
,即可获得相同的效果。与Raw
子类相比,这只是一个便利类。它不会让您更好地控制格式。