Импортировать объект из модуля с таким же именем, используя __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,... и т.д., а не объекты, содержащиеся в этих модулях.

Вопрос:

Как я могу изменить свой вызов __import__, чтобы он возвращал объект, содержащийся в модуле, а не сам модуль?

обходные:

Я нашел, может сделать getattr(obj, obj_name) чтобы извлечь объект, который я хочу.

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)

licensed under cc by-sa 3.0 with attribution.