Lambda用例混淆

2024-04-26 13:15:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在玩芹菜。在他们的例子中芹菜.py文件下面一行

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True)

其中lambda:settings.INSTALLED_APPSautodiscover_tasks()中形式参数packages的实际参数。并且settings.INSTALLED_APPS是一个元组。在

autodiscover_tasks()然后调用传递给它的函数,或者直接赋值它在第一行中给定的变量。。。在

^{pr2}$

所以我的问题是。我为什么不这么做。这似乎很多余。为什么不把settings.INSTALLED_APPS当作元组神想要的那样传递呢。为什么要传递一个调用它的匿名函数呢?我错过了什么?在


Tags: appsinstalled文件lambda函数pytrueapp
2条回答

除了Daniel的答案之外,下面是一个非常简单的示例,通过传递callable来展示“延迟评估”。在

>>> def foo(arg):
...     return lambda: arg() if callable(arg) else arg

这是一个函数,它返回另一个函数以伪造异步执行。在

构建两个函数:

^{pr2}$

在创建foo1foo2之后,更改foo_arg

>>> foo_arg = 4

调用函数:

>>> foo1()
3
>>> foo2()
4

foo1使用旧的foo_arg构造它,foo2调用匿名函数来获取foo_arg的当前值。在

由于Celery是异步的,因此settings.Installed_Apps在执行其他计算时不会发生变化,因此将其包装在lambda中会将其值封装为引用,直到被调用为止。在

编辑(添加注释示例):

setting.INSTALLED_APPS = 10
app.autodiscover_tasks(settings.INSTALLED_APPS, force=True) #is called with installed_apps = 10, so it give you an output.

现在想一想,当app.autodiscover_tasks被调用并进行其内部计算时,setting.INSTALLED_APPS现在{},因为您确实使用了这个变量,所以您的调用使用了10而不是'8',但是将它封装到lambdaapp.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True))中,当他需要它时,它将得到值,与它的实际值同步,它应该是8。在

相关问题 更多 >