2013-05-13 2 views
0

Я пытаюсь создать простую динамическую систему плагинов, в которой плагины, наследующие от класса Bot, автоматически регистрируются при импорте.Как я могу устранить этот метаклассовый TypeError?

Ниже приведен мой код. Обратите внимание, что я работаю от this короткой статьи.

import os.path as osp 
from glob import glob 
from imp import load_source 

from twisted.internet import reactor 

run = reactor.run 
halt = reactor.stop 


class Reactor(object): 
    _bot_registry = {} 

    def __init__(self, botdir): 
     map(load_source, *enumerate(glob(osp.join(botdir, '../bots/*.py')))) 
     self.bots = {k: v() for k, v in self._bot_registry.iteritems()} 


class Bot(object): 
    """Base class for Bots""" 
    class __metaclass__(type): 
     def __init__(cls, name, bases, dict): 
      type.__init__(name, bases, dict) 
      Reactor._bot_registry[name] = cls 

    def _update(self): 
     """Run through one scrape/process/respond iteration.""" 
     pass 

    def scrape(self): 
     pass 

    def process(self): 
     pass 

    def publish(self): 
     pass 

При импорте кода выше, я получаю TypeError следующим образом:

TypeError         Traceback (most recent call last) <ipython-input-42-dc3963f5e69b> in <module>() 
    19 
    20 
---> 21 class Bot(object): 
    22  """Base class for Knacki Bots""" 
    23  class __metaclass__(type): 

<ipython-input-42-dc3963f5e69b> in __init__(cls, name, bases, dict) 
    23  class __metaclass__(type): 
    24   def __init__(cls, name, bases, dict): 
---> 25    type.__init__(name, bases, dict) 
    26    Reactor._bot_registry[name] = cls 
    27 

TypeError: Error when calling the metaclass bases 
    descriptor '__init__' requires a 'type' object but received a 'str' 

Что я сделал не так?

ответ

2

type.__init__ имеет ту же подпись, что и ваш metaclass.__init__. Первый аргумент должен быть cls:

type.__init__(cls, name, bases, dict) 

Кстати: Никогда не имя переменной dict, так как тени предопределённые одного и того же имени. Я предлагаю

type.__init__(cls, name, bases, clsdict) 
+0

Действительно, вы правы. Я чувствую себя глупо. Я соглашусь как можно скорее! – blz

Смежные вопросы