如何在 argparse 中嵌套自定义参数解析器实例

How to nest custom argument parser instance in argparse

我正在尝试将我创建(并测试)的多个自定义 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),但它有多个独立的组件(例如预处理组件、建模组件等)。我想要的是拥有一个将所有组件解析器缝合在一起的统一命令,但我想从独立的解析器开始,以保​​持理智并使每个解析器都可以独立测试。

parents 机制将 Actions 从父级复制到新的解析器。它旨在作为一种合并 'imported' 解析器的方式,而无需知道其中的内容(尽管不难发现)。可能值得搜索 SO 以了解过去的经验。

Subcommands/parsers,将解析操作传递给新的解析器(如您所见,只有一个)。还有很多关于它的问题。它不能使用预定义的解析器(尽管我已经看到 bug/issue 对此类功能的请求)。但是预定义的解析器可以用作 parent.

您可以独立调用所有解析器。 parse_args() 不会更改 sys.argv,因此多个解析器可以使用同一个列表。 parse_known_args 对此更好,因此解析器不会因无法识别的字符串而退出。也不需要(默认)optionals 是最好的。通常情况下,当用户没有意识到某些导入的模块(例如 google youtube 应用程序)也在查看命令行时,多个解析器是一个错误。

或者您可以查看之前的 sys.argv,并将其拆分为您传递给不同解析器的子列表,例如parser1.parse_args(part_argv)