我正在开发一个 Python 项目,该项目使用
argparse
模块来处理命令行参数。我想打印与我的主解析器关联的 subparsers
的树结构,这样我就可以轻松地可视化可用命令的层次结构。
我对此功能的一些要求是:
它应该能够处理用
add_subparsers
定义的子解析器。
每个子解析器应通过其名称进行标识,并应包含任何关联的选项。
树结构应以可读且格式良好的方式打印。
我尝试使用argparse实现此行为,但我陷入了打印树结构的阶段。
预先感谢您提供的任何帮助或建议!
经过一番努力,我成功开发了一个解决方案,可以在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))
就我而言,输出是:
如果您有任何改进建议,我将非常乐意接受!