简单python插件系统
我正在用python为内部基于xml的元数据格式编写解析器。我需要提供不同的类来处理不同的标签。将需要一个相当大的处理程序集合,因此我将其设想为一个简单的插件系统。我想做的只是加载包中的每个类,并用解析器注册它。 我当前的尝试如下所示:简单python插件系统,python,Python,我正在用python为内部基于xml的元数据格式编写解析器。我需要提供不同的类来处理不同的标签。将需要一个相当大的处理程序集合,因此我将其设想为一个简单的插件系统。我想做的只是加载包中的每个类,并用解析器注册它。 我当前的尝试如下所示: (Handlers是包含处理程序的包,每个处理程序都有一个静态成员标记,它是字符串的元组) 然而,这是行不通的。我得到错误AttributeError:“module”对象没有属性“tags” 我做错了什么 您的handlerMod模块可能不包含任何标记变量。我
(Handlers是包含处理程序的包,每个处理程序都有一个静态成员标记,它是字符串的元组) 然而,这是行不通的。我得到错误
AttributeError:“module”对象没有属性“tags”
我做错了什么 您的
handlerMod
模块可能不包含任何标记
变量。我建议您阅读示例并解释如何编写插件体系结构。首先,对格式错误/不正确的代码表示歉意。也谢谢你看。然而,罪魁祸首经常在椅子和键盘之间。我把自己搞糊涂了,因为有同名的类和模块。我的_导入的结果(我现在意识到我甚至没有提到它来自何处……它来自于SO:)是一个名为实例areaHandler的模块。我想要这个类,也叫areaHandler。因此,我只需通过eval('Handlers.'+handler+'.+handler')来选择类。
再次感谢您的时间,对于通过库实现的简单且完全可扩展的带宽表示抱歉 代码可能看起来像
from extend_me import ExtensibleByHash
# create meta class
tagMeta = ExtensibleByHash._('Tag', hashattr='name')
# create base class for all tags
class BaseTag(object):
__metaclass__ = tagMeta
def __init__(self, tag):
self.tag = tag
def process(self, *args, **kwargs):
raise NotImeplemntedError()
# create classes for all required tags
class BodyTag(BaseTag):
class Meta:
name = 'body'
def process(self, *args, **kwargs):
pass # do processing
class HeadTag(BaseTag):
class Meta:
name = 'head'
def process(self, *args, **kwargs):
pass # do some processing here
# implement other tags in this way
# ...
# process tags
def process_tags(tags):
res_tags = []
for tag in tags:
cls = tagMeta.get_class(tag) # get correct class for each tag
res_tags.append(cls(tag)) # and add its instance to result
return res_tags
有关更多信息,请参阅或。
这个库在中使用,您实际上没有提供太多信息。错误消息可能会指出错误发生在哪一行,这显然有助于查明问题。另外,您的代码有语法错误(在类名、缩进后缺少冒号),所以您在这里发布的内容根本无法运行。另外,错误很可能出现在您没有发布的代码的某些部分…
eval
不是动态获取属性的好方法。通常的方法是getattr(getattr(Handlers,handler),handler)
。
from extend_me import ExtensibleByHash
# create meta class
tagMeta = ExtensibleByHash._('Tag', hashattr='name')
# create base class for all tags
class BaseTag(object):
__metaclass__ = tagMeta
def __init__(self, tag):
self.tag = tag
def process(self, *args, **kwargs):
raise NotImeplemntedError()
# create classes for all required tags
class BodyTag(BaseTag):
class Meta:
name = 'body'
def process(self, *args, **kwargs):
pass # do processing
class HeadTag(BaseTag):
class Meta:
name = 'head'
def process(self, *args, **kwargs):
pass # do some processing here
# implement other tags in this way
# ...
# process tags
def process_tags(tags):
res_tags = []
for tag in tags:
cls = tagMeta.get_class(tag) # get correct class for each tag
res_tags.append(cls(tag)) # and add its instance to result
return res_tags