Проверьте, реализуют ли классы в модулях правильный интерфейс - PullRequest
0 голосов
/ 18 июля 2011

У меня есть следующий интерфейс:

class Interface(object):

    __metaclass__ = abc.ABCMeta


    @abc.abstractmethod
    def run(self):
        """Run the process."""
        return

У меня есть наборы модулей, которые находятся в одном каталоге.Каждый модуль содержит один класс, который реализует мой интерфейс.

Например, Launch.py:

class Launch(Interface):

    def run(self):
        pass

Допустим, у меня есть 20 модулей, которые реализуют 20 классов.Я хотел бы иметь возможность запустить модуль, который будет проверять, не реализуют ли некоторые классы интерфейс.

Я знаю, что должен использовать:

  • issubclass (Launch,ProcessInterface), чтобы узнать, реализует ли определенный класс мой интерфейс процесса.
  • самоанализ для получения класса, который находится в моем модуле.
  • импорт модулей во время выполнения

IЯ просто не уверен, как это сделать.Мне удается использовать issubclass внутри модуля.Но я не могу использовать issubclass, если я вне модуля.

Мне нужно:

  1. получить список всех модулей в каталоге
  2. получить класс в каждом модуле
  3. сделать issubclass на каждомclass

Мне понадобится черновик функции, которая могла бы сделать это.

1 Ответ

0 голосов
/ 18 июля 2011

Вы, вероятно, ищете что-то вроде этого:

from os import listdir
from sys import path

modpath = "/path/to/modules"

for modname in listdir(modpath):
    if modname.endswith(".py"):

        # look only in the modpath directory when importing
        oldpath, path[:] = path[:], [modpath]

        try:
            module = __import__(modname[:-3])
        except ImportError:
            print "Couldn't import", modname
            continue
        finally:    # always restore the real path
            path[:] = oldpath

        for attr in dir(module):
            cls = getattr(module, attr)
            if isinstance(cls, type) and not issubclass(cls, ProcessInterface):
                # do whatever
...