Круговые зависимости Python для функций в одном файле

У меня есть структура кода примерно так:-

def send_message(msg):
    print msg + "\n"
    x.new_message("You",msg)


class GUI(Frame):

def createWidgets(self):
    self.input.bind('<Key-Return>',self.send)

def send(self, event):
    send_message(self.contents.get())
    self.contents.set("")
def new_message(self,sender, msg):
    line = sender+": "+msg+"\n"
    self.chat.contents.set(self.chat.contents.get()+line)

def __init__(self):
    self.createWidgets()

x = GUI()

Как вы можете видеть, это имеет некоторые круговые зависимости. Для функции send_message требуется экземпляр x, а также метод new_message с графическим интерфейсом. Определение GUI требует send_message. Таким образом, невозможно удовлетворить все ограничения. Что делать?

2 ответа

Решение

В полном коде, который вы показали в комментариях, мы видим, что вы звоните self.mainloop() в GUI.__init__, Это запустит обработку событий графического интерфейса и, вероятно, не прекратится до завершения программы. Только тогда назначение x = GUI() закончим и x будет доступно.

Чтобы обойти это, у вас есть несколько вариантов. Как правило, делает бесконечный цикл в __init__ вероятно, плохая идея. Вместо вызова mainloop() после того, как GUI создан.

def __init__(self):
    # only do init

x = GUI()
x.mainloop()

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

Имена в функциях Python не обязательно должны ссылаться на что-либо во время определения функции - они ищутся только тогда, когда функция на самом деле вызывается. Так что ваши send_message() прекрасно, как есть (хотя, вероятно, было бы лучше сделать x параметр, а не глобальная переменная).

Ваш GUI класс будет не в состоянии создать экземпляр, как показано, из-за ссылок на виджеты, которые вы не показали создание - self.input например. Я не могу сказать, сколько из этого связано с тем, что вы удалили код для публикации.

Другие вопросы по тегам