可以将lambda或其他方法用作python中的默认参数

时间:2018-06-02 03:12:49

标签: python lambda

我想使用在调用函数时初始化的默认参数,因此每次调用它时都会使用不同的默认参数。为了说明我要问的是你想要一个时间差异函数,如果没有提供第二次,则默认为当前时间:

通常你会做这样的事情。

def tdiff(target_time, curr_time=None):
   if curr_time == None:
      curr_time = datetime.datetime.now()
   return  curr_time - target_time

但摆脱if语句会更好。这可以用lambda完成吗? (像这样的东西)

def tdiff(target_time,  curr_time= lambda : datetime.now() ): 
    return curr_time - target_time

编辑:我理解lambda不起作用。其他任何方法都有效吗?

3 个答案:

答案 0 :(得分:5)

  

这可以用lambda完成吗?

没有。你所拥有的是语法上有效的,但是curr_time的默认值最终是lambda函数,而不是它被调用时返回的datetime值。这可以解决:

if callable(curr_time):
    curr_time = curr_time()

但是在那时,你也可以使用你问题中包含的if curr_time is None:方法。

(请注意,比较应该是is None,而不是== None。)

答案 1 :(得分:1)

你不能,出于一个非常重要的原因:

def f(arg=expression):

在执行expression语句时评估def,并且对象expression求值为保存在函数对象中作为本地名称arg的默认值。执行函数体时,在体arg内将只检索最初评估的对象expression。其中任何一个都无法改变。

因此,当然,您可以提供lambda表达式,但arg绑定到 lambda表达式返回的函数对象。如果你想调用那个功能对象,你需要在身体中将其拼写为arg()。普通的旧arg只会检索函数对象。

答案 2 :(得分:1)

感谢您的回答,并澄清我对任何方法感兴趣,而不仅仅是lambda。所以我看了一下属性,看看能不能起作用......

我创建了这个来试试。

import datetime

class DefaultParams():
    @property
    def curr_time( self ):
        return datetime.datetime.now()

当您访问属性defaults.curr_time运行它时,它会产生当前时间而不可调用

>>> defaults = DefaultParams()
>>> defaults.curr_time
datetime.datetime(2018, 6, 2, 10, 49, 16, 38295)
>>> defaults.curr_time
datetime.datetime(2018, 6, 2, 10, 49, 17, 211985)

所以当我打电话给tdiff

时,我把它插入并打印出curr_time
def tdiff(target_time,  curr_time= defaults.curr_time ): 
    print(curr_time)
    return curr_time - target_time

但是当我运行时,它会显示curr_time reaming static @ 10:48:58.675151。

>>> tdiff(datetime.datetime.now())
2018-06-02 10:48:58.675151
datetime.timedelta(-1, 85430, 433255)
>>> tdiff(datetime.datetime.now())
2018-06-02 10:48:58.675151
datetime.timedelta(-1, 85429, 58707)

所以它可能无论如何都是不可能的。我仍然认为python能够做这种事情会很有用。