使用__import__从同名模块导入对象

时间:2014-07-31 20:06:19

标签: python python-3.x import

我的目录结构如下:

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)提取我想要的对象。

1 个答案:

答案 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)