【问题标题】:Modular help message with python argparse使用 python argparse 的模块化帮助消息
【发布时间】:2020-12-03 21:10:10
【问题描述】:

我正在使用 python argparse 来管理命令行选项。 When the number of options becomes large, the help message (what argparse prints when you pass --help) is getting intimidating and hard to read, simply because it is to long.其他程序有时会通过模块化帮助消息来解决此问题:它们仅显示带有 --help 的“核心选项”,并具有 --help-modulea--help-moduleb 等选项。

我认为 argparse 允许在存在子命令的情况下进行类似的操作,基本上就像 git 所做的那样:./script.py command --help。 然而,我的应用程序没有子命令之类的东西,只有一大组选项(不过可以很好地分组)。

是否有任何(合理的)方法可以用 argparse 做到这一点?

【问题讨论】:

  • 您可能只是在寻找argument groups,尽管它们对抑制某些输出没有帮助。为此,您需要定义自己的选项处理程序。
  • 我已经在使用参数组对参数进行分组。 (显然)我不确定您所说的“选项处理程序”是什么意思...
  • 查看print_helpformat_help 的代码。您将看到如何调用HelpFormatter,以及如何将组传递给它。另请查看_help_action 类(或类似名称)。我可以想象创建类似的 Action 子类和/或格式化程序来显示您的 argument_groups 的子集。

标签: python argparse


【解决方案1】:

感谢@hpaulj 的回答,我仔细查看了argparse 内部结构并提出了以下建议。虽然它有一些警告,但我觉得这是一个好的开始:

class ModularHelpEnabler(argparse.Action):
    def __call__(self, parser, namespace, values, option_string = None):
        parser.enable_modular_help(self.const)

class ModularArgumentParser(argparse.ArgumentParser):
    def __init__(self, *args, **kwargs):
        self._modular_action_groups = {}
        modular_help_groups = kwargs.pop('modular_help_groups', [])
        super().__init__(*args, **kwargs)
        self._modular_help_groups = {}
        for name in modular_help_groups:
            self._modular_help_groups[name] = self.add_argument_group(name)

    def add_argument_group(self, *args, **kwargs):
        name = kwargs.pop('help_name', None)
        help_group = kwargs.pop('help_group', None)
        help_text = kwargs.pop('help_group', 'show help for {}')
        grp = super().add_argument_group(*args, **kwargs)
        if name is not None:
            self._modular_action_groups[grp] = name
            parser = self
            if help_group is not None:
                parser = self._modular_help_groups[help_group]
            parser.add_argument('--help-{}'.format(name), action=ModularHelpEnabler, nargs=0, const=grp, help = help_text.format(name))
        return grp
    def enable_modular_help(self, grp):
        del self._modular_action_groups[grp]
    def format_help(self):
        self._action_groups = [
            ag for ag in self._action_groups
            if ag not in self._modular_action_groups
        ]
        return super().format_help()

注意事项(修复起来并不简单,AFAIK):

  • --help-foo 并不暗示 --help
  • --help-foo 需要在之前提供--help

很遗憾,--help 直接触发打印帮助并退出。如果我们保留此行为,则需要在--help 本身之前指定修改帮助消息的所有内容。 我们可以推迟到解析完成后再打印帮助,但这意味着--help 不再隐藏解析错误(就像现在一样),从而显着改变当前行为。

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 2015-07-26
    • 2016-06-21
    • 2012-08-17
    • 2013-04-28
    • 1970-01-01
    • 2021-09-16
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多