gpt4 book ai didi

python - 从外部模块添加 argparse 参数

转载 作者:太空狗 更新时间:2023-10-30 00:02:52 25 4
gpt4 key购买 nike

我正在尝试编写一个可以由第三方扩展的 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() 提供的任何参数都将添加到该特定模块的子解析器中。我希望他们能够指定任何类型的参数。

我不确定声明然后从子类模块获取参数到我的主程序中的最佳方法。我成功地找到了 MyBaseClass 的所有子类并循环遍历它们以创建子解析器,但我找不到一种干净的方法来将各个参数添加到子解析器。

这是主程序的当前代码:

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() 或类似方法指定外部模块中的参数,然后将它们添加到子解析器中?我失败的尝试之一如下所示,它不起作用,因为它试图将所有可能的选项传递给 add_argument(),无论它是否有值:

            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 的父类(super class))具有这个通用签名

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

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

关于python - 从外部模块添加 argparse 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23851239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com