如何在 argparse 中嵌套自定义参数解析器实例
Posted
技术标签:
【中文标题】如何在 argparse 中嵌套自定义参数解析器实例【英文标题】:How to nest custom argument parser instance in argparse 【发布时间】:2021-11-14 17:21:52 【问题描述】:我正在尝试将我创建(和测试)的多个自定义 ArgumentParser 嵌套到更大的参数解析器中。
把它想象成一个脚本有多个独立的组件,每个组件都有自己的选项。我为每个参数创建了一个 ArgumentParser,测试了它们是否与单元测试一起正常工作,并希望将一个“母亲”参数解析器拼凑在一起,它可以一次获取所有选项,但它是基于组件的。每个组件都有一些必需的选项,如果我想将它们统一到组中,这会很麻烦。
所以我现在的伪代码是这样的:
def create_custom_parser1():
parser = ArgumentParser()
parser.add_argument('--component1-argument1')
...
def create_custom_parser2():
parser = ArgumentParser()
parser.add_argument('--component2-argument2')
...
def create_unified_parser():
unified = ArgumentParser()
component1_parser = create_custom_parser1()
component2_parser = create_custom_parser2()
# somehow do this:
# unified.add_parsers([component1_parser, component2_parser])
编辑:我的命令超长(它是一个机器学习训练管道 cli),但它有多个独立的组件(例如预处理组件、建模组件等)。我想要的是拥有一个将所有组件解析器缝合在一起的统一命令,但我想从独立的解析器开始,以保持我的理智并使每个解析器独立测试。
【问题讨论】:
argparse 只提供了 2 个这样的工具,parents
和 subcommands
@hpaulj 我想通过运行 cli 顺序运行所有这些独立组件。有可能以这种方式吗?我认为子命令用于具有多个可能的命令,但在这里我有一个包含多个组件的超长命令。
【参考方案1】:
parents
机制将Actions
从父级复制到新的解析器。它旨在作为一种合并“导入”解析器的方式,而不知道其中有什么(尽管不难发现)。可能值得搜索 SO 以了解过去的经验。
子命令/解析器,将解析操作传递给新的解析器(如您所见,只有一个)。还有更多关于它的问题。它不能使用预定义的解析器(尽管我已经看到了对此类功能的错误/问题请求)。但是预定义的解析器可以用作parent
。
您可以独立调用所有解析器。 parse_args()
不会改变 sys.argv
,因此多个解析器可以使用同一个列表。 parse_known_args
对此更好,因此解析器不会因无法识别的字符串而退出。最好也不需要(默认)optionals
。通常,当用户没有意识到某些导入的模块(例如 google youtube 应用程序)也在查看命令行时,多个解析器是错误的。
或者您可以查看 sys.argv
之前,并将其拆分为您传递给不同解析器的子列表,例如parser1.parse_args(part_argv)
等
【讨论】:
使用 sys.argv 手动处理它是我认为不好的模式,使用 parse known_args 的父级或拥有解析器列表实际上是一件好事。以上是关于如何在 argparse 中嵌套自定义参数解析器实例的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python argparse 解析多个嵌套的子命令?