ArgumentParser与ArgumentDefaultsHelpFormatter结合使用的epilog和描述格式

时间:2013-08-27 10:10:04

标签: python argparse

我正在使用argparse接受命令行输入并生成帮助文本。我想将ArgumentDefaultsHelpFormatter用作formatter_class,但这会阻止我使用RawDescriptionHelpFormatter,这样我就可以在自己的描述或结语中添加自定义格式。

除了自己编写代码以生成默认值的文本之外,还有一种明智的方法可以实现这一目的吗?根据argparse文档,ArgumentParser的所有内部都被视为实现细节,而不是公共API,因此子类化不是一个有吸引力的选择。

2 个答案:

答案 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的内部。该文档包含自定义ActionType类(或函数)的示例。如果需要,我会将'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子类相比,这只是一个便利类。它不会让您更好地控制格式。