1

我正在尝试在 Python (2.7) 中设计一个易于扩展/模块化的命令行应用程序。每个模块称为一个“任务”。每个文件有一个任务,包含在 tasks/ 目录中,每个包含 的子类Task,以及run()包含给定任务的代码入口点的方法。因为我希望每个“任务文件”都包含将任务注册到系统中所需的一切。每个任务都包含元数据,例如帮助、可用参数、身份验证信息、类别等。这些不仅仅是静态属性——例如,帮助系统使用Templates 替换$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()。其中一些任务相当繁重。“列表任务”的加载时间超过一秒并且很明显。我想缓存它,但似乎有点矫枉过正。

什么是更清洁/更快的方法来做到这一点?我应该以某种方式缓存任务元数据吗?我希望这尽可能动态以简化任务的开发。我想过一个包含元数据的内部类,但不确定。我相信所有任务的imports 仍然需要处理,而且我不清楚在 " Meta" 内部类和包含Task. 对 python 较新,所以想知道我是否遗漏了一些东西。你们是如何设计插件模型的?谢谢!

4

1 回答 1

2

我不确定我是否完全理解你的问题,但我认为这个说法

我们必须有效地扫描目录、导入、加载和实例化每个任务,只是为了调用 getHelp()

显然不是真的。例如,一个类不需要实例化(重)实例以获得静态的编译时数据。加载器非常快,尤其是在处理预解析.pyc文件时。

我正在考虑一个例子,但值得注意的是

 import Task
 import TestTask
 print(TestTask.description)

相对于

 tt = TestTask()
 print(tt.get_help())

因为不需要在前者中创建实例。

添加示例

我使用包含 112k 源代码行的 194 个模块的 python 标准库作为导入速度测试。删减的代码是:

import abc
import aifc
import anydbm
import argparse
import ast
…
import webbrowser
import whichdb
import xdrlib
import xmllib
import xmlrpclib
import zipfile
print(tty.setraw.__doc__)

在我动力不足的笔记本电脑上运行 230 毫秒。该__doc__属性是在导入时绑定到名称的函数文档字符串,即使从预解析.pyc文件加载也是如此。

于 2013-05-20T02:42:32.673 回答