我正在尝试嵌套多个自定义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
从父解析器复制到新的解析器。它的目的是作为一种合并"导入"解析器的方式,而不知道其中有什么(尽管发现这一点并不难)。也许值得搜索一下过去使用它的经验。
子命令/解析器,将解析动作传递给新的解析器(如您所注意的,只有一个)。关于它还有很多SO问题。它不能使用预定义的解析器(尽管我曾见过针对这种特性的bug/问题请求)。但是预定义的解析器可以用作parent
。
可以独立调用所有解析器。parse_args()
不会改变sys.argv
,因此多个解析器可以使用相同的列表。parse_known_args
更适合于此,因此解析器不会因为无法识别的字符串而退出。另外,不需要(默认)的optionals
是最好的。通常情况下,多个解析器是一个错误,当用户没有意识到一些导入的模块(例如google youtube应用程序)也在查看命令行。
或者你可以看看之前的sys.argv
,并将其分成子列表,然后传递给不同的解析器,例如parser1.parse_args(part_argv)
等。