argparse中不同级别的帮助详细信息

2024-09-27 23:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有几十个CLI参数的应用程序。我使用python argparse来解析参数。其中大多数很少使用,只有5或6个经常使用。对于简单的情况,我不想把--help的输出搞得乱七八糟,但是仍然有可能以某种方式看到所有参数的描述

在argparse中可能有多个详细级别的帮助?以下是我的预期

$ myapp -h
optional arguments:
 --foo         Do foo stuff
 --bar         Do bar stuff

$ myapp -hh # or myapp --expert-mode -h
optional arguments:
  --foo         Do foo stuff
  --bar         Do bar stuff

expert arguments:
  --use-warp-drive
  --no-fasten-seatbelts
... 50 more arguments

我的第一个想法是创建两个ArgumentParser-s,基本的和详细的。首先,调用了basic的parse_args。如果存在--expert标志,将创建并调用详细解析器。这种方法有两个缺点。首先,-h由第一个解析器无条件地处理,因此我应该实现自己的类似帮助标志。其次,在没有--expert标志的情况下,甚至不能解析专家选项,我希望无条件解析它们(但不要在帮助中弹出)

注:溶液应符合python2标准


更新:使用Lior Cohen的答案和this问题中的想法,我创建了一个工作示例。在我的例子中,创建“简单”选项的白名单更容易,因此甚至不需要使用标记的动作类型

下面是演示代码

class ExpertHelpFormatter(argparse.HelpFormatter):
    skip_expert_section = True
    whitelist = set(("foo",))

    def add_usage(self, usage, actions, groups, prefix=None):
        if self.skip_expert_section:
            actions = [action for action in actions if action.dest in self.whitelist]
        ret = super(ExpertHelpFormatter, self).add_usage(usage, actions, groups, prefix)
        if self.skip_expert_section:
            self.add_text("Use -hh for detailed help.")
        return ret

    def add_argument(self, action):
        if self.skip_expert_section and action.dest not in self.whitelist:
            return
        super(ExpertHelpFormatter, self).add_argument(action)

def main():
    parser = argparse.ArgumentParser(add_help=False, formatter_class=ExpertHelpFormatter)

    parser.add_argument("-h", "--help", action="count", default=0)
    parser.add_argument("--foo")
    parser.add_argument("--use-warp-drive", action="store_true")

    args = parser.parse_args()

    if args.help == 1:
        print parser.format_help()
        return
    elif args.help > 1:
        ExpertHelpFormatter.skip_expert_section = False
        print parser.format_help()
        return

Tags: selfaddparseriffooargparsehelpargs
1条回答
网友
1楼 · 发布于 2024-09-27 23:23:41

这里是一个布局,应该给你你需要的,虽然它不是“免费的工作”

  1. 通过add_help = False禁用默认帮助(请参见here)。这将使您仍然可以使用-h帮助执行所需的操作
  2. 您需要通过type来“标记”您的专家参数,这将以某种方式存储foo是“简单”的而use-warp-drive是“专家”的事实。您可以向Action添加一个属性,或者在解析器本身中保存一个全局dict
  3. 编写一个帮助格式化程序(您可以看到example)。然后,根据上面的“标记”,在“简单”模式下,您可以通过返回""来抑制“专家”帮助

希望这有帮助

相关问题 更多 >

    热门问题