Мне интересно, как я могу отправлять данные в функцию обратного вызова, определенную во внешней области видимости, изнутри внутренней области видимости.
Вот минимальный пример, который проще описать с помощью кода:
from somelib import CreateWebserver, Collector
def collector_callback(code):
# I want to affect some change to the server from this function
# i.e. server.close()
print(code)
def main():
server = CreateWebserver()
# The signature for this callback was defined by the library and I can't change it
collector = Collector(collector_callback)
# Blocks forever
collector.listen()
if __name__ == "__main__":
main()
В приведенном выше примере я создаю свою программу в функции main
.
Я использую библиотеку с классом Collector
. Класс принимает обратный вызов, который вызывается, когда происходит событие, и подпись этой функции определяется библиотекой (я не могу ее изменить).
Допустим, обратный вызов вызывается со случайным числом, и Я хочу что-то сделать с сервером, если число больше 5.
Как получить доступ к объекту server
в функции collector_callback
?
Кажется, это единственный способ сделать это - сделать сервер глобальной переменной, чего я не хочу делать, потому что я хочу сохранять инкапсуляцию.
Есть ли лучший способ достичь объекта server
в этом случае, Дано, чем collector_callback
будет вызываться только со случайным числом?