Динамический модуль импорта списка классов из модуля, учитывая его полный путь - PullRequest
1 голос
/ 28 февраля 2011

Во-первых, мне кажется правильным сказать, что я прочитал следующие вопросы:

И я не чувствую, что они обращаются к моему случаю использования. Тем не менее, вот мой вопрос:

Как я могу динамически импортировать из файла конфигурации, как это:

[imports]
/var/imports/foo.py = baz monkey
/var/imports/bar.py = ape

Чтобы я мог вызывать известные объекты через интерфейс RESTful, как этот.

# http://localhost/data?operation=get&class=baz&id=1
def handler(object):
  def handle(self):
    cls = instantiate(request.args["class"])
    meth = request.args["operation"]
    return getattr(cls,meth,request.args)

И он может ответить результатом get () для экземпляра этого класса.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Посмотрите на 2-ю ссылку еще раз. Уже упоминается imp.load_source:

import imp

# some sort of shared dict for everything imported
loaded = {}

def load(path, from_list):
    # load the path
    module = imp.load_source( "dummy", path)
    for name in from_list:
        # add the names
        loaded[name] = getattr(module, name)

#lets say you have this:
data = "/var/imports/foo.py", ["baz"]
load(*data)
print loaded['baz'] # whatever foo.baz was

Теперь вы можете сделать что-то вроде этого:

def instantiate( clsname ):
    obj = loaded[clsname]
    return obj()

Надеюсь, это поможет вам.

1 голос
/ 28 февраля 2011

Вот примерный набросок реестра классов, который вы можете использовать следующим образом:

class ClassRegistry(object):

    def __init__(self):
        self.classes = {}

    def add_file_classes(self, fname, class_list):
        globals = {}
        exec open(fname) in globals
        for class_name in class_list:
            self.classes[class_name] = getattr(globals, class_name)

    def get_class(self, class_name):
        return self.classes[class_name]

Прочитайте ваш конфигурационный файл и вызовите add_file_classes следующим образом:

reg = ClassRegistry()
reg.add_file_classes("/var/imports/foo.py", ["baz", "monkey"])
reg.add_file_classes("/var/imports/bar.py", ["ape"])

затем позже

cls = reg.get_class("baz")

Обратите внимание, что мы на самом деле не импортируем файлы, а просто выполняем их и собираем их результаты.

...