创建(更确切地说)通用插件框架?

你好, 我的想法是创建一个正常工作的系统:每个模块都知道 通往插件目录的路径,该目录包含模块 可能会将钩子添加到代码中的某些点. 受http://www.python.org/pycon/2005/pap...onhooking.html的启发 我会创建这样的课程: 类打印机: def printit(self,msg): fuck = self.beforeprinthook(msg) 如果有东西: msg =东西 打印味精 self.fterprinthook(msg) def tof tof printhook(self,msg):通过 Def Afterprinthook(self,msg):通过 现在,本着py.test的精神,我希望API几乎完全没有API :) 此外,部署插件必须仅仅包括将适当的文件添加到 插件目录,仅此而将其删除将卸载. 这 插件应该能够以某种方式导致所有未来的调用 printer.printit()插件中指定的调用挂钩. 现在,插件模块 对于上面的课程 /可能 /遵循以下几行(我在想东西 在这里,我还不知道最合适的方法): ###一个非常简单的插件,它可以将所有数据供给它. 扩展= {'打印机':'Printhook'} 班级打印机: def tof tof printhook(self,msg): 返回msg.upper() Def Afterprinthook(self,msg): 打印"称为msg%s"%msg的"称为afterprinthook" 现在,我有一个非常粗鲁的(我认为)实施,有两种方法,首先 加载插件模块的一个: def find_plugins(): mods = [mod in mod in os.listdir(plugin_dir)如果mod.endswith('.py')] #对于插件DIR中的每个模块,导入模块和设置钩. 钩子 #与原始类中一样,插件模块中必须具有平等的方法名称. 对于mod中的mod: name = os.path.splitext(mod)[0] fobj,fpath,desc = imp.find_module(os.path.join(plugin_dir,name)) 模块= imp.load_module(名称,fobj,fpath,desc) set_hooks(模块) ....然后另一个负责设置钩子的 def set_hooks(mod): #mod.extensions将" base"类名称作为键,(挂钩,优先级)为 #值 对于K,mod.extensions.items()中的钩子: #获取类对象 hook_cls = mod .__ dict __ [钩] 尝试: base = globals()[k] 除了KeyError: 打印"没有这样的课程可以将钩子插入:",k 别的: 对于基础中的项目.__ dict __: 如果item.endswith('hook'): #Override Original(No-Op)挂钩方法 #嗯.. kludgety kludge base .__ dict __ [item] = hook_cls .__ dict __ [item] 现在,我的plugindemo.py只需如下: find_plugins() p =打印机() P.Printit("你好,世界!") 哪个打印 $ Python2.4 Plugindemo.py 你好世界! 称为MSG Hello,World,称为Afterprinthook! 但是,嘿,这有很多弊端. 首先,机制不支持 任意名称空间. 在这里,插件中的类标识符必须像 从调用插件的模块中看到(对我来说不是问题,但可以 更优雅; 逻辑类标识符和 实际的班级名称,嗯?). 第二,如果一个人想使用许多钩子(与 冲突的优先级),现在不可能; set_hooks总是覆盖 潜在的现有钩子. 也许还有许多其他问题 对我来说很明显,但是出于我的简单目的,它似乎有效. 这是我正在写的Python中的第一个插件系统,所以我可以成为一个路要走 正确的路径..

# 回答1

爱德华·玛雅卡里(Edvard Majakari)写道: - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"
# 回答2

爱德华·玛雅卡里(Edvard Majakari)写道: - - Bruno Desthuilliers python -c" print'@'.join(['.'.join([w [::-1] for p.split('.'.')]) p in'O ****@xiludom.gro'.split('@')])"

标签: python

添加新评论