如何在Python中打印argparse解析器的子解析器的树结构?

问题描述 投票:0回答:1

我正在开发一个 Python 项目,该项目使用

argparse
模块来处理命令行参数。我想打印与我的主解析器关联的
subparsers
的树结构,这样我就可以轻松地可视化可用命令的层次结构。

我对此功能的一些要求是:

  1. 它应该能够处理用

    add_subparsers
    定义的子解析器。 每个子解析器应通过其名称进行标识,并应包含任何关联的选项。

  2. 树结构应以可读且格式良好的方式打印。

  3. 我尝试使用argparse实现此行为,但我陷入了打印树结构的阶段。

预先感谢您提供的任何帮助或建议!

python-3.x tree command-line-interface
1个回答
0
投票

经过一番努力,我成功开发了一个解决方案,可以在Python中打印

subparsers
解析器的
argparse
的树结构。该解决方案是使用递归函数来实现的,该函数遍历
subparsers
并打印树结构。

def subparserTree(parser, start="", down=["│", " "], leaf=["├", "╰"], item=["┬", "╴"], indInc=1) -> str:
    subparsers_actions = [action for action in parser._actions if isinstance(action, argparse._SubParsersAction)]
    strOut = f"{parser.prog}\n" if not start else ""
    for subparsers_action in subparsers_actions:
        for choice, subparser in subparsers_action.choices.items():
            endSublist = choice == list(subparsers_action.choices.keys())[-1]
            strOut += start + (leaf[endSublist] + "─" * indInc)
            retString = subparserTree(subparser, start=start + (down[endSublist] + " " * indInc), down=down, leaf=leaf, indInc=indInc)
            strOut += item[0] if retString else ""
            strOut += item[1] + choice
            # Aggiungi opzioni, se disponibili
            if subparser._optionals:
                options_str = []
                for action in subparser._optionals._actions:
                    optionStr = ""
                    if hasattr(action, 'option_strings') and action.option_strings:
                        optionStr += f"{action.option_strings[0]}"
                        if action.metavar:
                            optionStr += f" {"...".join(action.metavar)} " if not isinstance(action.metavar, str) else f" {action.metavar}"
                        elif action.nargs or action.required:
                            optionStr += f" {action.dest.upper()}"
                    if optionStr:
                        options_str.append(f"{optionStr}" if action.required else f"[{optionStr}]")
                options_str.sort()
                strOut += " " + " ".join(options_str)
            strOut += "\n" + retString
    return strOut

要使用此函数,只需使用主解析器调用它并打印结果:

print(subparserTree(parser))

就我而言,输出是:

如果您有任何改进建议,我将非常乐意接受!

© www.soinside.com 2019 - 2024. All rights reserved.