Я пытаюсь создать простую динамическую систему плагинов, в которой плагины, наследующие от класса 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'
Что я сделал не так?
Действительно, вы правы. Я чувствую себя глупо. Я соглашусь как можно скорее! – blz