Почему сигналы колб не работают с лямбдами? - PullRequest
0 голосов
/ 27 декабря 2018

Это работает:

from flask import Flask, request_started

app = Flask(__name__)
app.debug = True

def echo(sender, **extra):
    return print('request_started')

request_started.connect(echo)

@app.route('/')
def index():
    return 'index page'

, а это не так:

from flask import Flask, request_started

app = Flask(__name__)
app.debug = True

request_started.connect(lambda sender, **extra: print('request_started'))

@app.route('/')
def index():
    return 'index page'

Почему это так?

первые выходы правильно, в то время как лямбда ничего не дает, т.е.без ошибок.

Я использую python 3.6

Очевидно, это не имеет ничего общего с функцией print, я тоже пробовал это, и это не сработало.

request_started.connect(lambda sender, **extra: open('output', 'w').write('request_started\n'))

~ ОБНОВЛЕНИЕ ~

Теперь, это работает, и я запутался!

echo = lambda sender, **extra: print('request_started')
request_started.connect(echo)

1 Ответ

0 голосов
/ 28 декабря 2018

Сигналы колб реализованы с использованием библиотеки blinker : https://pythonhosted.org/blinker/index.html#blinker.base.Signal.connect

Сигнатура функции connect:

 connect(receiver, sender=ANY, weak=True)

С документацией, в которой говорится следующее о параметре weak:

слабый - При значении true сигнал будет удерживать слабый сигнал на приемнике и автоматически отключаться при выходе из негообласти или мусора.По умолчанию установлено значение True

Поскольку в первом примере используется параметр по умолчанию True, а других ссылок на lambda нет, он автоматически отключается после завершения вызова request_started.connect(lambda sender, **extra: print('request_started')).

Во второй версии

echo = lambda sender, **extra: print('request_started')
request_started.connect(echo)

вы сохраняете ссылку на lambda в переменной echo, поэтому сигнал подключается до тех пор, пока echo не выйдет из области видимости (и не станет мусором).взысканных)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...