В Python такие вещи, как def, class и import также являются операторами.
Модули выполняются во время импорта, и новые функции и классы не будут появляться в пространстве имен модуля до определения def (или класса)оператор был выполнен.
Это имеет некоторые интересные последствия, если вы выполняете рекурсивный импорт.
Рассмотрим модуль X, который импортирует модуль Y, а затем определяет функцию с именем spam:
# module X
import Y
def spam():
print "function in module x"
Если вы импортируете X из своей основной программы, Python загрузит код для X и выполнит его.Когда Python достигает оператора import Y, он загружает код для Y и начинает выполнять его вместо этого.
В настоящее время Python установил объекты модулей для X и Y в sys.modules.Но X еще ничего не содержит;оператор def spam не был выполнен.
Теперь, если Y импортирует X (рекурсивный импорт), он вернет ссылку на пустой объект X-модуля.Любая попытка доступа к функции X.spam на уровне модуля завершится неудачей.
# module Y
from X import spam # doesn't work: spam isn't defined yet!
Обратите внимание, что вам не нужно использовать from-import, чтобы попасть в неприятности:
# module Y
import X
X.spam() # doesn't work either: spam isn't defined yet!
Чтобы это исправить, либо выполните рефакторинг вашей программы, чтобы избежать циклического импорта (перемещение материала в отдельный модуль часто помогает), либо перенесите импорт в конец модуля (в этом случае, если вы перемещаете импорт Y в конец модуля X), все будет работать нормально).
Надеюсь, это поможет.