【问题标题】:Dynamic module import of class list from module given its full path给定完整路径的模块动态模块导入类列表
【发布时间】:2011-02-28 17:31:50
【问题描述】:

首先,我认为我已经阅读了以下问题似乎是合适的:

而且,我不觉得他们解决了我的用例。也就是说,这是我的问题:

如何从这样的配置文件中动态导入:

[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() 的结果进行响应。

【问题讨论】:

  • 我不确定我是否理解了这个问题。导入配置在此代码中的位置?您如何以及为什么使用它?
  • 这正是 Django 等 webapp 框架解决的问题。此外,您似乎没有区分类和实例。

标签: python dynamic-import


【解决方案1】:

再看第二个链接。它已经提到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()

我希望这能让你开始。

【讨论】:

    【解决方案2】:

    这是一个类注册表的粗略草图,您可以像这样使用:

    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")
    

    请注意,我们实际上并没有导入文件,只是执行它们并收集它们的结果。

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 2022-11-30
      • 2019-10-31
      • 1970-01-01
      • 2021-10-04
      相关资源
      最近更新 更多