简单python插件系统

简单python插件系统,python,Python,我正在用python为内部基于xml的元数据格式编写解析器。我需要提供不同的类来处理不同的标签。将需要一个相当大的处理程序集合,因此我将其设想为一个简单的插件系统。我想做的只是加载包中的每个类,并用解析器注册它。 我当前的尝试如下所示: (Handlers是包含处理程序的包,每个处理程序都有一个静态成员标记,它是字符串的元组) 然而,这是行不通的。我得到错误AttributeError:“module”对象没有属性“tags” 我做错了什么 您的handlerMod模块可能不包含任何标记变量。我

我正在用python为内部基于xml的元数据格式编写解析器。我需要提供不同的类来处理不同的标签。将需要一个相当大的处理程序集合,因此我将其设想为一个简单的插件系统。我想做的只是加载包中的每个类,并用解析器注册它。 我当前的尝试如下所示:
(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