子命令的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(...)
应该可以工作(尽管我还没有测试过)。你会依赖这里的实现细节......但我认为没有任何官方方法可以让它工作。