Вызов вложенных модулей в Python - PullRequest
0 голосов
/ 28 июня 2018

Я недавно работал над проектом с более чем 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 модуля без создания этой циклической зависимости.

1 Ответ

0 голосов
/ 28 июня 2018

Мне кажется, что круговой импорт . Проблема между second.py и third.py . Вы вызываете третий в second.py , а затем second в third.py . Вы можете прочитать эту статью , чтобы узнать, что такое циклический импорт и как его предотвратить.

P.S. Я бы предложил не использовать этот синтаксис для импорта содержимого из других модулей.

from ... import * 

Это может привести к конфликтам имен, и вы не знаете, что находится внутри этого модуля. Лучший вариант - импортировать только те вещи, которые вам нужны, или ссылаться на определенные функции модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...