Круговые зависимости 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
например. Я не могу сказать, сколько из этого связано с тем, что вы удалили код для публикации.