2009-06-17 70 views
0

我正在为python中的内部基于xml的元数据格式编写解析器。我需要提供不同的类来处理不同的标签。将需要一个相当大的处理程序集合,所以我将它想象成一个简单的插件系统。我想要做的只是加载包中的每个类,并将其注册到我的解析器。 我现在的尝试是这样的:
(处理程序是包含处理器的包装,每个处理器有一个静态成员变量,这是一个字符串数组)简单的python插件系统

class MetadataParser: 
    def __init__(self): 
     #... 
     self.handlers={} 
     self.currentHandler=None 
     for handler in dir(Handlers): # Make a list of all symbols exported by Handlers 
      if handler[-7:] == 'Handler': # and for each of those ending in "Handler" 
       handlerMod=my_import('MetadataLoader.Handlers.' + handler) 
       self.registerHandler(handlerMod, handlerMod.tags) # register them for their tags 

    # ... 

    def registerHandler(self, handler, tags): 
     """ Register a handler class for each xml tag in a given list of tags """ 
     if not isSequenceType(tags): 
      tags=(tags,) # Sanity check, make sure the tag-list is indeed a list 
     for tag in tags: 
      self.handlers[tag]=handler 

但是,这是行不通的。我收到错误AttributeError: 'module' object has no attribute 'tags' 我在做什么错?

+1

修复您的缩进。 – SilentGhost 2009-06-17 11:59:45

+1

你并没有提供太多的信息。错误信息可能会说*错误发生在哪一行,这显然有助于查明问题。此外,你的代码有语法错误(在类名称缩进后缺少冒号),所以你在这里发布的内容根本不会运行。此外,错误可能发生在您未发布的代码的某些部分中...... – sth 2009-06-17 12:13:00

回答

0

首先,道歉为格式不正确/不正确的代码。
也感谢您的关注。然而,罪魁祸首就是经常在椅子和键盘之间。我通过拥有同名的类和模块来困惑自己。 my_import的结果(我现在意识到我甚至没有提及它来自哪里......它来自SO:link)是一个名为areaHandler的模块。我想要这个班,也叫做areaHandler。所以我只需要通过eval('Handlers。'+ handler +'。'+ handler)挑选出类。
再次,感谢您的时间,并且对带宽

0

可能是您的handlerMod模块中的一个不包含任何tags变量。

0

我建议您阅读this page的示例和解释,其中介绍了如何编写插件体系结构。

0

通过extend_me库简单和完全地扩展实现抱歉。

代码可能看起来像

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 

欲了解更多信息,看看documentationcode。 此库用于OpenERP/Odoo RPC lib