可以将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)