gpt4 book ai didi

python - 为什么 flask 信号不能与 lambda 一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 14:40:14 25 4
gpt4 key购买 nike

这个有效:

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'

这是为什么?

第一个输出正确,而 lambda 什么也没给出,即没有错误。

我正在使用 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)

最佳答案

Flask signals使用 blinker 库实现:https://pythonhosted.org/blinker/index.html#blinker.base.Signal.connect

connect 函数的签名是:

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

文档中关于 weak 参数的说明如下:

weak – If true, the Signal will hold a weakref to receiver and automatically disconnect when receiver goes out of scope or is garbage collected. Defaults to True

由于您的第一个示例使用默认参数 True 并且没有其他对 lambda 的引用,因此在调用 request_started.connect 后它会自动再次断开连接(lambda sender, **extra: print('request_started')) 完成。

在第二个版本中

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

您在变量 echo 中保留对 lambda 的引用,因此信号一直连接到 echo 超出范围(并且是垃圾收集)

关于python - 为什么 flask 信号不能与 lambda 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53950568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com