Как прервать цикл импорта в python - PullRequest
23 голосов
/ 26 августа 2011

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

Теперь нужно вызывать методы Rat из методов Cobra и наоборот. Для этого мне нужно импортировать Cobra в Rat.py и Rat в Cobra.py

Это создает цикл импорта и выдает ошибку. Не могу импорт Кобра внутри Кобра.

Как это исправить ??

Cobra.py

import Rat
class Cobra():
    def check_prey(self, rat ):
        # Some logic 
        rat.foo()

Rat.py

import Cobra
class Rat():
    def check_predator(self, snake ):
        # some_logic ..
        snake.foo()

1 Ответ

30 голосов
/ 26 августа 2011

Если вы не используете Cobra в определении класса Rat или наоборот (т. Е. Используются только внутри методов), тогда вы можете фактически переместить оператор импорта в конец файла, к этому времени определение класса уже будетсуществовать.

Class Cobra:
...
def check_prey(self, rat ):
    Some logic rat.foo()

import Rat


import Cobra
class Rat
...
def check_predator(self, snake ):
   some_logic ..
   snake.foo()

Или вы также можете ограничить область импорта

Class Cobra:
...
def check_prey(self, rat ):
    import Rat
    Some logic rat.foo()

import Cobra
class Rat
...
def check_predator(self, snake ):
   some_logic ..
   snake.foo()

Если вы не используете имена классов Rat и Cobra напрямую, вы даже не сможетевообще нужны операторы импорта: пока свойства и функции существуют в экземплярах крысы или змеи, python не имеет значения, из какого они класса.

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

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