我正在编写一个带有自定义日志记录实用程序的模块,以便在其他脚本中导入。
它基于标准库日志记录模块。
这些实用程序之一如下所示:
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 定义第一个解析器:这会对用户隐藏该选项,而我不想这样做。
- 以某种方式使用子命令:这里似乎不适用。