根据完整路径动态导入类列表的模块
首先,我觉得有必要说明一下,我已经看过以下几个问题:
不过,我觉得这些问题并没有解决我的具体需求。那么,我的问题是:
我该如何从一个配置文件中动态导入内容,比如这样:
[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
再看看第二个链接。里面已经提到过 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
这里有一个大概的类注册表,你可以像这样使用:
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")
注意,我们并不是在真正导入这些文件,而只是执行它们并收集它们的结果。