替换 argparse 中的参数

max*_*mir 1 python argparse

我有一个无法修改的基类(代码可能有其他错误,但请忽略这些)

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)

Ant*_*ile 6

如果您无法修改基类实现,则可以访问 的属性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),但否则使用公共接口。