我想使用在调用函数时初始化的默认参数,因此每次调用它时都会使用不同的默认参数。为了说明我要问的是你想要一个时间差异函数,如果没有提供第二次,则默认为当前时间:
通常你会做这样的事情。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不起作用。其他任何方法都有效吗?
答案 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_timedef 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能够做这种事情会很有用。