Многократный импорт в Python - PullRequest
1 голос
/ 24 октября 2011

Как люди могут обойти эту проблему:

Контроллер (скажем, controller.py) импортирует две модели (скажем, a_model.py и b_model.py):

from app.model import a_model
from app.model import b_model

Теперь давайтескажем, что a_model хочет использовать функцию в b_model (скажем, он хочет получить что-то из b_model, где id записи происходит из запроса в a_model, поэтому я делаю (в a_model):

from app.model import b_model

Теперь, так как наш контроллер уже импортировал b_model.py и a_model.py пытается сделать то же самое, мы ломаем приложение.

Может кто-нибудь сказать мне лучший способ обойти это? Может быть, использовать прокси? Илизагрузчик библиотеки?

Ответы [ 3 ]

6 голосов
/ 24 октября 2011

Нет проблем с импортом модуля из двух разных модулей в Python. Возможно, ваш конкретный дизайн делает это проблемой, но это не то, что навязывает Python.

В любом случае, вы, вероятно, могли бы решить эту проблему, переместив обычные вещи из a_model и b_model в какой-то другой модуль, т.е. model_common, и импортировав их из a_model и b_model.

4 голосов
/ 24 октября 2011

Это нормально, если у вас нет циклических ссылок, т. Е.

main --> model.a_model -> model.b_model
     \-> model.b_model

В порядке.

Но если вы добавите import a_model из b_model.py, все будетусложняется тем, что не было бы способа упорядочить загрузку таким образом, чтобы для каждого модуля были выполнены все предварительные условия.

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

1 голос
/ 24 октября 2011

Это то, что вы пытаетесь сделать?

class A(db.Model):
  b = db.ReferenceProperty(B)

class B(db.Model):
  a = db.ReferenceProperty(A)

Если это так, то, скорее всего, легко исправить одну из них на слабую ссылку:

class A(db.Model):
  b = db.ReferenceProperty()

class B(db.Model):
  a = db.ReferenceProperty(A)

Это дерьмовое решение, без вопросов. Я не уверен, есть ли лучший способ сделать это.

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