gpt4 book ai didi

python - 基于类的 "Task"模块的好模式吗?

转载 作者:行者123 更新时间:2023-12-01 05:44:17 24 4
gpt4 key购买 nike

我正在尝试用 Python (2.7) 设计一个易于扩展/模块化的命令行应用程序。每个模块称为“任务”。每个文件有一个任务,包含在tasks/目录中,每个任务都包含Task的子类,以及一个包含给定代码入口点的run()方法任务。因为我希望每个“任务文件”包含将任务注册到系统中所需的所有内容。每个任务都包含元数据,例如帮助、可用参数、身份验证信息、类别等。这些不仅仅是静态属性 - 例如,帮助系统使用 Template 来替换 $variable帮助文本中的内容。

下面是一些示例代码:

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() 。其中一些任务相当繁重。 “列表任务”的加载时间超过一秒,而且很明显。我想过缓存它,但似乎有点过分了。

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

最佳答案

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

we have to effectively scan the directory, import, load, and instantiate each task just to call 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__ 属性是函数文档字符串,它在导入时绑定(bind)到名称,即使是从预解析的 .pyc 文件加载时也是如此。

关于python - 基于类的 "Task"模块的好模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16641678/

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