импорт модуля, который импортирует основной модуль

Я работаю над текстовым приключением, в котором уровни хранятся в виде огромного словаря под названием «места». Вместо того, чтобы иметь его в основном файле, я подумал, что сделаю отдельный файл с именем «levels.py», который будет содержать его, что сделает мой код чище и избавит от необходимости просматривать более 450 строк другого кода, чтобы добавить к нему. .

Итак, основной файл игры:

from levels import places

class Thing:
    #Some stuff

уровни.py:

from game import *
places = {
    "bleh" : Thing("bleh"),
}

Однако похоже, что «места» в игре не определены.

Я думаю, что происходит то, что есть «петля» импорта. Однако, если level.py необходимо импортировать классы из game.py, как я могу предотвратить подобное?


person Cheezey    schedule 27.06.2012    source источник
comment
У вас не может быть циклической зависимости. Разделите ваши модули правильно.   -  person Yuval Adam    schedule 27.06.2012
comment
Ну, вы можете, но это плохая идея.   -  person Wooble    schedule 27.06.2012
comment
мои классы также требуют словарь мест.   -  person Cheezey    schedule 27.06.2012


Ответы (2)


Всегда можно провести рефакторинг для устранения циклических зависимостей. Переместите Thing в thing.py, затем в game.py и levels.py используйте from thing import Thing. Промыть и повторить.

person ecatmur    schedule 27.06.2012
comment
Спасибо, но поскольку у меня много классов, я просто поместил их все в новый файл с именем «classes.py», и оба файла импортировали его. Кроме того, это делает game.py более реальным игровым процессом и меньшим количеством определений классов. - person Cheezey; 27.06.2012
comment
@Чизи, import game \\...\\ "bleh": game.Thing("bleh") - person Aleksei astynax Pirogov; 27.06.2012

Вы можете изменить levels, чтобы иметь инициализатор или фабричный метод, который принимает объект, предоставленный game.

Например:

# levels.py
# no import needed here; we'll just take an instance when required
def get_places(thing):
    return {"bleh": thing("bleh")}

# game.py

import levels

class Thing:
    def __init__(self):
        self.places = levels.get_places(self)

Изменить:

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

person mrb    schedule 27.06.2012