可以将lambda或其他方法用作python中的默认参数吗
我想使用一个在调用函数时初始化的默认参数,这样每次调用它时它都是一个不同的默认参数。为了说明我的问题,假设您想要一个默认为当前时间的时间差函数(如果未提供第二时间): 通常你会这样做可以将lambda或其他方法用作python中的默认参数吗,python,lambda,Python,Lambda,我想使用一个在调用函数时初始化的默认参数,这样每次调用它时它都是一个不同的默认参数。为了说明我的问题,假设您想要一个默认为当前时间的时间差函数(如果未提供第二时间): 通常你会这样做 def tdiff(target_time, curr_time=None): if curr_time == None: curr_time = datetime.datetime.now() return curr_time - target_time 但最好不要使用if语句。这可以
def tdiff(target_time, curr_time=None):
if curr_time == None:
curr_time = datetime.datetime.now()
return curr_time - target_time
但最好不要使用if语句。这可以用lambda来完成吗?(类似这样的)
编辑:我知道lambda不起作用。还有其他方法有效吗
这可以用lambda来完成吗
不可以。您拥有的是语法上有效的,但是curr\u time
的默认值最终是lambda函数,而不是调用它时将返回的datetime
值。这可以通过以下方式解决:
if callable(curr_time):
curr_time = curr_time()
但在这一点上,如果curr\u time为None,您最好使用您在问题中包含的方法
(请注意,比较应为为None
,而不是==None
)由于一个非常基本的原因,您不能:
def f(arg=expression):
在执行def
语句时计算expression
,并且对象expression
计算结果保存在函数对象中,作为本地名称arg
的默认值。当执行函数体时,在函数体中,arg
将简单地检索最初计算为的对象表达式
。这一切都无法改变
因此,当然,您可以提供一个lambda
表达式,但是arg
将绑定到lambda
表达式返回的函数对象。如果要调用该函数对象,则需要在正文中将其拼写为arg()
。纯旧的arg
将仅检索函数对象。感谢您的回答,并澄清我对任何方法都感兴趣,不仅仅是lambda。所以我看了一下酒店,看看这是否可行
我创建这个是为了尝试一下
import datetime
class DefaultParams():
@property
def curr_time( self ):
return datetime.datetime.now()
当您访问属性defaults.curr\u 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时的当前时间
def tdiff(target_time, curr_time= defaults.curr_time ):
print(curr_time)
return curr_time - target_time
但当我运行时,它显示当前时间铰孔静态@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能够做这类事情会很有用。您自己试过了吗,成功了吗?请出示一些effort@ResetACK事实上,它并没有像现在这样起作用,我也不知道这是否可能。所以我想如果你能用其他的方式提供它,它可能会起作用。例如,向datetime((1,1,1))之类的函数提供元组将不起作用,除非您像datetime(*(1,1,1))那样对其进行解包。我不知道为什么这个问题会遭到否决。这是一个有效的问题,这个功能将非常有用。自己去试试根本不是什么好建议。显然OP已经尝试过lmbda,但它没有起作用。但也许其他人有其他的想法可能会奏效。谢谢@Dashwuff。2票反对,现在不太可能引起任何注意。
>>> 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)