Проблемы с импортом в Python - PullRequest
       36

Проблемы с импортом в Python

0 голосов
/ 11 октября 2019

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

Кажется, это потому, что я импортирую основной класс в новый модуль, что вызывает проблему, потому что всякий раз, когда я удаляю импорт, он работает, но больше не может получить доступ к переменным из основного класса, необходимым для функционирования,

Основной класс:

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task()

Новый модуль:

from Main import variable1, variable2

class Mod:
    def task(self):
        print(variable1+variable2)

Когда я запускаю основной класс, я получаю это:

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
ImportError: cannot import name 'Mod' from 'Mod' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py)

И когда я запускаю новый модуль, я получаю это:

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
ImportError: cannot import name 'variable1' from 'Main' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py)

Я понятия не имею, почему это может произойти. Это противоречит тому, что я делал в Java.

Как бы я мог ссылаться на глобальные переменные, хранящиеся в главном классе, если бы не импортировал их?

Ответы [ 5 ]

3 голосов
/ 11 октября 2019

Ваша проблема здесь называется " циклическая зависимость ". Main.py пытается импортировать класс из Mod.py, но, прежде чем это произойдет, Mod должен импортировать некоторые переменные из Main.py, но, прежде чем это произойдет ...

В общем, способ решениякруговая зависимость - это реорганизация структуры вашей программы. Например, вы можете иметь возможность параметризовать Mod так, чтобы он больше не зависел от Main. Например:

Main.py:

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task(variable1, variable2)

Mod.py:

class Mod:
    def task(self, a, b):
        print(a + b)

Кроме того, вы можете хранить variable1 и variable2 в другомфайл. Поиск наилучшего решения будет зависеть от того, что лучше всего подходит для вашей программы.

0 голосов
/ 11 октября 2019

Я не понимаю, что Вы имеете в виду в Java, такие вещи могут быть выполнены ... Но в python возможно соблюдение правила, согласно которому тела модулей, ссылающихся на цепи, должны иметь возможность выполнять без доступа к другимСодержание вовлеченных модулей.
Так можно сделать:

# cat Main.py
import Mod
var1=2
var2=3
if __name__ == '__main__':
    mod=Mod.Mod()
    mod.task()
# cat Mod.py
import Main
class Mod(object):
    def task(self):
        print(Main.var1+Main.var2)

Например. Или выполните инициализацию модулей с функциями, которые вы вызываете после успешного завершения цепочки импорта.
В любом случае, в большинстве случаев лучше избегать таких вещей, просто инициализируя ваши классы и вызывая функции с параметрами.

0 голосов
/ 11 октября 2019

Следуйте принципам СУХОЙ. Не повторяйся.

импорт переменных "Main" в Mod вызывает циклическую зависимость. То, что вы должны избегать любой ценой. Используйте Object Oriente Programming для решения вашей проблемы.

Шаги для решения проблемы:

  1. Удалить импорт Main.
  2. Изменить функцию задачи, чтобы разрешить передачу двух аргументов. Это должно быть что-то вроде этого

    def task(self, variable1, variable2):
       print(variable1 + variable2)
    

    # Вы можете использовать любое имя для переменных 1 и 2

  3. В сценарии Main просто вызовите функцию:

    Mod.task(variable1, variable2)
    

    Здесь вы должны использовать имя переменных, потому что вы сейчас вызываете определение, которое вы дали в Main.

0 голосов
/ 11 октября 2019

Это вызвано циклической зависимостью

Как упоминалось в ответе выше, способ решения циклической зависимости заключается в реорганизации структуры вашей программы. Использование параметров

Тем не менее, простой обходной путь для этого - сделать встроенный импорт

Main.py

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task()

Mod.py


class Mod:
    def task(self):
        from Main import variable1, variable2
        print(variable1+variable2)
0 голосов
/ 11 октября 2019

Вы можете обновить Mod.task (), чтобы получить два дополнительных параметра, так что вы получите:

def task(self, a, b):
    print(a + b)

Тогда, в основном, вы просто скажете:

mod.task(variable1, variable2)

Нет необходимости в импорте, кроме импорта мода в ваш основной класс

...