在以下表达式中使用lambda

Jib*_*bin 5 python lambda openerp

在开发OpenERP时,我发现了以下代码

'app_date': lambda *a: time.strftime('%Y-%m-%d')

我知道lambda是什么.我的问题是为什么要使用lambda?为什么不呢?

'app_date': time.strftime('%Y-%m-%d')

Bre*_*arn 13

'app_date': time.strftime('%Y-%m-%d')time.strftime立即评估.通过将其包装在lambda中,它的执行将延迟到稍后(调用lambda的时间).粗略地说,区别在于"我定义它的时间"和"我使用它的时间".看:

>>> d = {'a': time.time(), 'b': lambda: time.time()}
>>> d['a'], d['b']()
(1346913545.049, 1346913552.409)
>>> d['a'], d['b']()
(1346913545.049, 1346913554.518)
>>> d['a'], d['b']()
(1346913545.049, 1346913566.08)
Run Code Online (Sandbox Code Playgroud)

我允许在每个之间经过一段时间d['a'], d['b']().请注意,d['a']它始终是相同的:它是我定义的时间d. d['b']是一个功能. d['b']()(带括号)调用函数,该函数在每次调用时重新计算时间,因此每次使用时都会有所不同.

而且,这没什么特别的lambda.Lambdas就像其他任何功能一样.我也可以这样做:

def func():
    return time.time()
d = {'a': time.time(), 'b': func}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这是OpenERP模型默认值的常见缺陷.大多数OpenERP默认值可以是简单的文字字符串/整数/布尔值,但是日期时间需要包装在可调用的中,否则默认的valye将始终是服务器启动日期和时间,而不是当前时间. (2认同)