Я недавно работал над проектом с более чем 150 файлами, и я столкнулся с большим препятствием в переключении модулей.
У меня есть функция, которая позволяет переключать модули. Это работает следующим образом (я даю упрощенное объяснение):
Предположим, есть 4 файла: first.py
, second.py
, third.py
, fourth.py
, и каждый из следующих файлов имеет модуль, совпадающий с именем файла, который вызывает свою предыдущую функцию, как показано ниже.
Содержимое first.py
from second import *
def first():
second()
Содержимое second.py
from third import *
def second():
third()
Содержимое third.py
:
from fourth import *
def third():
q = raw_input('Use (f)ourth or go (b)ack?')
if q == 'f':
fourth() # proceed to fourth
elif q == 'b':
second() # back to second module
# this is how the switching of modules work
Содержимое fourth.py
:
def fourth():
<stuff1>
Теперь, когда вызывается first()
, переводчик запрашивает f or b
. Если f
, то <stuff1>
выполняется, но когда b
является вводом, это дает NameError
что-то вроде этого.
Traceback (most recent call last):
File "first.py", line 4, in <module>
first()
File "first.py", line 3, in first
second()
File "test/second.py", line 3, in second
third()
File "test/third.py", line 7, in third
second()
NameError: global name 'second' is not defined
И именно так происходит переключение модулей назад. Я попытался импортировать second.py
в третий файл, добавив from second import second
, который не помог, но вместо этого вывел ImportError как ImportError: cannot import name second
. Объявление function names
как global variables
тоже не помогло.
Есть ли способ, как я могу этого достичь. Или есть более эффективный способ решения проблемы переключения.
Edit:
Я понимаю, что создается циклическая зависимость, но есть ли другой способ запустить и запустить 4 модуля без создания этой циклической зависимости.