我有一个无法修改的基类(代码可能有其他错误,但请忽略这些)
class BaseClass(object):
def __init__(self):
self.parser = argparse.ArgumentParser()
self.parser.add_argument("arg1", choices=("a", "b"))
Run Code Online (Sandbox Code Playgroud)
我想要的是覆盖 arg1 如下
class DerivedClass(BaseClass):
def __init__(self):
BaseClass.__init__(self)
self.parser.add_argument("arg1", choices=("a", "c", "d"))
Run Code Online (Sandbox Code Playgroud)
如果您无法修改基类实现,则可以访问 的属性parser并修改您关心的特定操作。这是一个演示代码的草图:
from base import BaseClass
def _modify_choices(parser, dest, choices):
for action in parser._actions:
if action.dest == dest:
action.choices = choices
return
else:
raise AssertionError('argument {} not found'.format(dest))
class MySubClass(BaseClass):
def __init__(self):
super(MySubClass, self).__init__()
_modify_choices(self.parser, 'arg1', ('a', 'b', 'c'))
def main():
inst = MySubClass()
inst.parser.parse_args()
if __name__ == '__main__':
exit(main())
Run Code Online (Sandbox Code Playgroud)
和用法:
$ python subclass.py d
usage: subclass.py [-h] {a,b,c}
subclass.py: error: argument arg1: invalid choice: 'd' (choose from 'a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)
请注意,这涉及私有实现细节(特别是ArgumentParser._actions),但否则使用公共接口。