我的目录结构如下:
root/
__main__.py
files/
__init__.py
foo.py
bar.py
baz.py
每个文件中都有一个与文件同名的对象。你可以想象,foo = MyObj(1)
行在foo.py中,而bar = MyObj(2)
在bar.py等中。
为了从root/files/
中的每个文件导入同名对象,我在root/files/__init__.py
中有以下代码:
all_objects = []
#assume file_list is populated with list of files in root/files/
for file_name in file_list:
mod_name = file_name[:-3] #chop off the '.py'
obj_name = file_name[:-3] #remember, object I want has same name as module
obj = __import__(mod_name, globals=globals(), locals=locals(), fromlist=(obj_name), level=1)
all_objects.append(obj)
这里,obj
包含模块foo,bar,... etc和不这些模块中包含的对象。
如何更改__import__
调用,使其返回模块中包含的对象而不是模块本身?
我发现可以getattr(obj, obj_name)
提取我想要的对象。
答案 0 :(得分:1)
你需要调用相当于:
的东西obj = __import__("mymod", ...).mymod
重现
from mymod import mymod
通过名称获取对象的属性可以使用
完成getattr(obj, 'mymod')
# or
obj.__dict__['mymod']
# or
vars(obj)['mymod']
选一个。 (如果我真的不得不这样做,我会去getattr
。
obj = getattr(__import__(mod_name, globals=globals(), locals=locals(), fromlist=(obj_name), level=1), mod_name)