Как достичь функции во внешней области с данными из innerscope? - PullRequest
0 голосов
/ 26 апреля 2020

Мне интересно, как я могу отправлять данные в функцию обратного вызова, определенную во внешней области видимости, изнутри внутренней области видимости.

Вот минимальный пример, который проще описать с помощью кода:

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 будет вызываться только со случайным числом?

1 Ответ

2 голосов
/ 26 апреля 2020

Вы можете использовать functools.partial, чтобы создать функцию, в которой один из параметров установлен и отсутствует в сигнатуре полученной функции

def collector_callback(server, code):
    server.close()
    print(code)


def main():
    server = CreateWebserver()
    callback = functools.partial(collector_callback, server)
    # callback is now a function with only one parameter "code"
    # server is always passed as the first parameter to collector_callback
    # when it is called
    collector = Collector(callback)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...