Из документации по питону __import__
:
__import__( name[, globals[, locals[, fromlist[, level]]]])
...
Когда переменная имени имеет форму
package.module, обычно,
пакет верхнего уровня (название до
первая точка), а не
модуль по имени. Тем не менее, когда
задан непустой аргумент fromlist,
модуль, названный по имени, возвращается.
Это сделано для совместимости с
байт-код, сгенерированный для
различные виды декларации на импорт;
при использовании «import spam.ham.eggs»
должен быть размещен пакет спама верхнего уровня
в импортирующем пространстве имен, но когда
используя "from spam.ham import eggs",
Подпакет spam.ham должен использоваться для
найти переменную яйца. Как
Для обхода этого поведения используйте
getattr () для извлечения желаемого
компоненты. Например, вы могли бы
определите следующий помощник:
def my_import(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
Перефразировать:
Когда вы запрашиваете somepackage.somemodule
, __import__
возвращает somepackage.__init__.py
, который часто пуст.
Он вернет somemodule
, если вы предоставите fromlist
(список имен переменных внутри somemodule
, которые вы хотите, которые на самом деле не возвращаются)
Вы также можете, как и я, использовать предложенную ими функцию.
Примечание: я задал этот вопрос полностью, намереваясь ответить на него сам. В моем коде была большая ошибка, и из-за ее неправильной диагностики мне потребовалось много времени, чтобы выяснить это, поэтому я решил помочь сообществу SO и опубликовать ошибку, с которой столкнулся здесь.