我正在尝试在 Python (2.7) 中设计一个易于扩展/模块化的命令行应用程序。每个模块称为一个“任务”。每个文件有一个任务,包含在 tasks/ 目录中,每个包含 的子类Task
,以及run()
包含给定任务的代码入口点的方法。因为我希望每个“任务文件”都包含将任务注册到系统中所需的一切。每个任务都包含元数据,例如帮助、可用参数、身份验证信息、类别等。这些不仅仅是静态属性——例如,帮助系统使用Template
s 替换$variable
帮助文本中的 s。
这是一些示例代码:
class TestTask(Task):
description = "This task prints 'Hello world...' and exits."
help = "Usage: $argv0 $task ...\n ..."
def __init__(self, arguments=None):
super(TestTask, self).__init__(description=self.description, arguments=arguments, help=self.help)
def run(self):
print("Hello world...")
那么,我们如何显示任务的帮助呢?或者获取带有描述的所有任务的列表?好吧,我们必须有效地扫描目录、导入、加载和实例化每个任务,只是为了调用getHelp()
它getDescription()
。其中一些任务相当繁重。“列表任务”的加载时间超过一秒并且很明显。我想缓存它,但似乎有点矫枉过正。
什么是更清洁/更快的方法来做到这一点?我应该以某种方式缓存任务元数据吗?我希望这尽可能动态以简化任务的开发。我想过一个包含元数据的内部类,但不确定。我相信所有任务的import
s 仍然需要处理,而且我不清楚在 " Meta
" 内部类和包含Task
. 对 python 较新,所以想知道我是否遗漏了一些东西。你们是如何设计插件模型的?谢谢!