Круговой (или циклический) импорт в Python - PullRequest
292 голосов
/ 13 апреля 2009

Что будет, если два модуля импортируют друг друга?

Чтобы обобщить проблему, как насчет циклического импорта в Python?

Ответы [ 11 ]

0 голосов
/ 06 февраля 2015

Хорошо, я думаю, у меня есть довольно крутое решение. Допустим, у вас есть файл a и файл b. У вас есть def или class в файле b, который вы хотите использовать в модуле a, но у вас есть что-то еще, либо def, class, либо переменная из файла a что вам нужно в вашем определении или классе в файле b. В нижней части файла a вы можете после вызова функции или класса в файле a, необходимого в файле b, но до вызова нужной функции или класса из файла b для файла a, скажем import b Затем, и вот ключевая часть , во всех определениях или классах в файле b, которым требуется def или class из файла a (назовем это CLASS) Вы говорите from a import CLASS

Это работает, потому что вы можете импортировать файл b без Python, выполняющего какие-либо операторы импорта в файле b, и, таким образом, вы исключаете любой циклический импорт.

Например:

Файл a:

class A(object):

     def __init__(self, name):

         self.name = name

CLASS = A("me")

import b

go = B(6)

go.dostuff

Файл b:

class B(object):

     def __init__(self, number):

         self.number = number

     def dostuff(self):

         from a import CLASS

         print "Hello " + CLASS.name + ", " + str(number) + " is an interesting number."

Вуаля.

...