Python 从外部模块添加argparse参数

Python 从外部模块添加argparse参数,python,argparse,Python,Argparse,我正在尝试编写一个可以由第三方扩展的Python程序。程序将从命令行运行,并提供任何参数 为了允许第三方创建自己的模块,我创建了以下(简化的)基类: class MyBaseClass(object): def __init__(self): self.description = '' self.command = '' def get_args(self): # code that I can't figure out to s

我正在尝试编写一个可以由第三方扩展的Python程序。程序将从命令行运行,并提供任何参数

为了允许第三方创建自己的模块,我创建了以下(简化的)基类:

class MyBaseClass(object):
    def __init__(self):
        self.description = ''
        self.command = ''

    def get_args(self):
        # code that I can't figure out to specify argparse arguments here
        # args = []
        # arg.append(.....)
        return args
它们通过get_args()提供的任何参数都将添加到该特定模块的子Parser中。我希望他们能够指定任何类型的参数

我不确定最好的方法是声明子类模块中的参数,然后将其放入主程序中。我成功地找到了MyBaseClass的所有子类,并通过它们循环创建子parser,但我找不到一种干净的方法将各个参数添加到子parser

以下是主程序的当前代码:

for module in find_modules():
    m = module()
    subparser_dict[module.__name__] = subparsers.add_parser(m.command, help=m.help)
    for arg in m.get_args():
            subparser_dict[module.__name__].add_argument(...)
如何最好地通过get_args()或类似方式指定外部模块中的参数,然后将它们添加到子Parser?我的一次失败尝试如下所示,但不起作用,因为它尝试传递所有可能的选项以添加_参数(),无论它是否有值:

            subparser_dict[module.__name__].add_argument(arg['long-arg'],
                action=arg['action'],
                nargs=arg['nargs'],
                const=arg['const'],
                default=arg['default'],
                type=arg['type'],
                choices=arg['choices'],
                required=arg['required'],
                help=arg['help'],
                metavar=arg['metavar'],
                dest=arg['dest'],
                )

在不完全理解模块结构的情况下,我认为您希望能够将
add_argument
调用的参数作为可以导入的对象提供

例如,您可以提供位置参数列表和关键字参数字典:

args=['-f','--foo']
kwargs={'type':int, 'nargs':'*', 'help':'this is a help line'}

parser=argparse.ArgumentParser()
parser.add_argument(*args, **kwargs)
parser.print_help()
生产

usage: ipython [-h] [-f [FOO [FOO ...]]]

optional arguments:
  -h, --help            show this help message and exit
  -f [FOO [FOO ...]], --foo [FOO [FOO ...]]
                        this is a help line
argparse.py
中,
add_argument
方法(属于
ArgumentParser
的超类)具有此常规签名

def add_argument(self, *args, **kwargs):

此方法的代码处理这些参数,将
args
添加到
kwargs
,添加默认值,并最终将
kwargs
传递到相应的
Action
类,返回新操作。(它还向解析器或子解析器“注册”操作)。列出参数及其默认值的是Action子类的
\uuuu init\uuuu

我只需要从
get\u args
方法返回一个
ArgumentParser
实例。然后,您可以创建一个新的
参数解析器
,以使用
父参数
连接所有其他参数解析器: