Argparse:是否可以组合来自多个解析器的帮助文本?

2023-12-20

我正在编写一个带有自定义日志记录实用程序的模块,以便在其他脚本中导入。 它基于标准库日志记录模块。

这些实用程序之一如下所示:

import argparse as ap

def parse_log_args() -> dict:

    log_arg_parser = ap.ArgumentParser(description='Parses arguments that affect logging')
    log_arg_parser.add_argument(
        '--level',
        dest='level',
        help='Sets logging level',
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
    )
    log_args, _ = log_arg_parser.parse_known_args()
    return vars(log_args)

该函数查找与日志记录有关的参数(即使暂时仅定义了 --level),并独立于(且之前)所有其他函数来解析这些参数,以便可以尽早配置日志记录并在其余部分中使用脚本的。

这里的目标是保持灵活性,并能够快速插入对这些参数的支持,无论是在不需要其他参数的脚本中还是在需要其他参数的脚本中。

从简单解析参数的角度来看,这是可行的:该函数首先运行,解析 --level,然后特定于脚本的解析器来处理其余的事情。

然而,问题在于帮助文本。当我运行一个使用 --help 调用此函数的脚本时,它仅显示来自第一个解析器的帮助文本,而不是来自特定于脚本的解析器。所以像这样:

Parses arguments that affect logging

optional arguments:
  -h, --help            show this help message and exit
  --level {DEBUG,INFO,WARNING,ERROR,CRITICAL}
                        Sets logging level
  • 有没有办法将所有 ArgumentParser 实例的帮助文本合并到脚本中?
  • 或者:是否有不同的方法以灵活/插件的方式实现此目的,即无需修改现有的 ArgumentParsers 或必须将它们添加到尚未使用它们的脚本中?

PS:之前也有人问过类似的问题:Argparse 组合 --help 指令 https://stackoverflow.com/questions/46718568/argparse-combine-help-directives但提出的想法并没有真正解决问题:

  • 使用 add_help=False 定义第一个解析器:这会对用户隐藏该选项,而我不想这样做。
  • 以某种方式使用子命令:这里似乎不适用。

我认为这可能符合要求:

import argparse

part1 = argparse.ArgumentParser(add_help=False)

#... some parsing takes place ...

part2 = argparse.ArgumentParser(add_help=True, parents=[part1])

part1解析器必须完全初始化parents上班。

有关该主题的更多信息:https://docs.python.org/3/library/argparse.html#parents https://docs.python.org/3/library/argparse.html#parents

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Argparse:是否可以组合来自多个解析器的帮助文本? 的相关文章

随机推荐