Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “基于类的良好模式”;任务“;模块?_Python_Design Patterns_Plugins_Python 2.7_Module - Fatal编程技术网

Python “基于类的良好模式”;任务“;模块?

Python “基于类的良好模式”;任务“;模块?,python,design-patterns,plugins,python-2.7,module,Python,Design Patterns,Plugins,Python 2.7,Module,我正试图用Python(2.7)设计一个易于扩展/模块化的命令行应用程序。每个模块称为“任务”。每个文件有一个任务,包含在任务/目录中,每个任务包含task的子类,以及一个run()方法,该方法包含给定任务的代码入口点。因为我希望每个“任务文件”都包含将任务注册到系统中所需的所有内容。每个任务都包含元数据,如帮助、可用参数、身份验证信息、类别等。这些不仅仅是静态属性——例如,帮助系统使用模板s替换帮助文本中的$variables 下面是一些示例代码: 类测试任务(任务): descriptio

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

下面是一些示例代码:

类测试任务(任务):
description=“此任务打印“Hello world…”并退出。”
help=“用法:$argv0$task…\n…”
def uuu init uuuu(self,arguments=None):
super(TestTask,self)。\uuuu init\uuuu(description=self.description,arguments=arguments,help=self.help)
def运行(自):
打印(“你好,世界…”)
那么,我们如何显示任务的帮助呢?或者获取所有任务的列表以及描述?嗯,我们必须有效地扫描目录,导入、加载和实例化每个任务,只需对其调用
getHelp()
getDescription()
。其中一些任务相当繁重。“任务列表”上的加载时间超过一秒钟,并且是明显的。我想把它缓存起来,但似乎有点过头了


什么是更干净/更快的方法?我是否应该以某种方式缓存任务元数据?我希望这是尽可能动态的,以便于任务的开发。我考虑过一个包含元数据的内部类,但不确定。我相信,所有任务的
导入
仍然需要处理,我不清楚如何在“
”内部类和包含
任务的
之间共享信息。python的更新版本,所以我想知道我是否遗漏了什么。你们是如何设计插件模型的?谢谢

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

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

这显然不是真的。例如,为了获得静态编译时数据,类不需要实例化(重载)实例。加载程序相当快,尤其是在使用预解析的
.pyc
文件时

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

 import Task
 import TestTask
 print(TestTask.description)
应该是相对于

 tt = TestTask()
 print(tt.get_help())
因为不需要在前者中创建实例

添加了示例

我使用包含194个模块(包含112k源代码行)的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毫秒的速度运行。
\uuuu doc\uuuu
属性是在导入时绑定到名称的函数docstring,即使从预解析的
.pyc
文件加载时也是如此

您可以查看现有的替代方案,特别是web框架,它们通常提供挂钩。特别是在任务方面,允许您处理参数并提供有用的帮助函数(甚至允许您创建类似git的子parser)。它甚至可以让您获得格式良好的输出。你的包会做什么而argparse不会呢?已经在使用ArgumentParser了——这不是问题所在。也不使用框架——这是框架。如果有帮助,我可以在问题中提供更多信息。我的问题基本上是关于如何以一种性能良好的方式封装元数据。我们谈论的“帮助”实际上不仅仅是“用法”——它为某些任务提供了帮助页面。关键是任务本身必须包含此元数据,至少在任务类所在的文件中是这样。对不起,我的意思是,您可以查看其他框架是如何处理插件的,尽管我想不出有多少框架能够处理如此多的插件,以至于仅仅导入它们是困难的。是的,我正在研究Django如何使用“Meta”,这让我想到了探索缓存之外的选项。我们不是在谈论大量的任务——最多30-50项?除了Django之外,你能想到其他框架吗?能够动态添加任务有那么重要吗?你能保留一个在任务、描述和路径之间有某种映射的文件吗?Django接受导入名称的字符串列表。也许你可以保留一个名为“register.py”的文件来处理这个问题,每个文件夹都可以有自己的任务
register.py
。对,我喜欢在静态上下文中这样做。但我还需要能够无缝地从动态上下文中执行相同的操作。我可以在实例上下文中轻松地使用classmethod吗?你最后一句话也把我弄糊涂了。当tt=TestTask()创建实例时,怎么不需要实例?@msw说,您可以访问类的属性而无需实例化它,并且第一个示例与第二个示例相比要快得多(因为它不需要实例化类)。啊,是的,“后一个”让我困惑:)我的最后一句话有一个bug(前一个!=后一个)这就是你可能会感到困惑的原因。修复了,抱歉。谢谢!很高兴知道。听起来好像静态上下文就是它所在的位置。静态方法调用也相当便宜吗?