34

我正在使用argparse来接受命令行输入并生成帮助文本。我想将其ArgumentDefaultsHelpFormatter用作formatter_class,但是这 RawDescriptionHelpFormatter使我无法使用它来为我的描述或结语添加自定义格式。

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

4

2 回答 2

49

我刚刚尝试了一种多重继承方法,它可以工作:

class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter):
    pass

parser = argparse.ArgumentParser(description='test\ntest\ntest.',
                                 epilog='test\ntest\ntest.',
                                 formatter_class=CustomFormatter)

但是,如果这些类的内部发生变化,这可能会中断。

于 2013-08-27T10:18:08.630 回答
2

我不明白为什么子类化 aHelpFormatter应该是一个问题。这并没有弄乱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子类相比,这只是一个便利类。它不能让您更好地控制格式。

于 2013-08-27T17:13:19.960 回答