子命令的argparse 文档add_parser说通过调用返回的对象上的方法来添加子解析器add_subparsers。该add_parser方法“采用命令名称和任何ArgumentParser构造函数参数,并返回一个ArgumentParser可以照常修改的对象。”
除了创建一个覆盖该add_parser方法的子类之外,我是否可以添加一个本身是子类的子解析器ArgumentParser?
子命令的argparse 文档add_parser说通过调用返回的对象上的方法来添加子解析器add_subparsers。该add_parser方法“采用命令名称和任何ArgumentParser构造函数参数,并返回一个ArgumentParser可以照常修改的对象。”
除了创建一个覆盖该add_parser方法的子类之外,我是否可以添加一个本身是子类的子解析器ArgumentParser?
我认为 mgilson 的回答几乎是正确的,但是您可以在不依赖这样的实现细节的情况下做到这一点:
class Foo(ArgumentParser): pass
parser = ArgumentParser()
subparsers = parser.add_subparsers(parser_class=Foo)
subparser = subparsers.add_parser(...)
看了源码后,ArgumentParser是whoich的一个子类,_ActionsContainer继承了whoset_SubParsersAction的__init__一个_parser_class属性。. 然后使用此属性构建新的解析器。
换句话说,类似:
class Foo(ArgumentParser): pass
parser = ArgumentParser()
parser._parser_class = Foo
subparser = parser.add_parser(...)
应该可以工作(尽管我还没有测试过)。你会依赖这里的实现细节......但我认为没有任何官方方法可以让它工作。