我想将一个函数作为可选参数 python中的另一个函数,但我不清楚如何做到这一点。
例如,我定义了以下函数:
import os, time, datetime
def f(t=datetime.datetime.now()):
return t.timetuple()
我已放置t=datetime.datetime.now()
为了使参数可选,所以
能够在没有参数的情况下调用f()
。
现在每当我执行f()
时,我得到相同的日期时间A(这根据我的预期是错误的),但每当我执行f(datetime.datetime.now())
时,我会得到不同的日期时间(这是正确的)如预期的那样。)
例如
>>> f()
time.struct_time(tm_year=2015, tm_mon=6, tm_mday=20, tm_hour=15, tm_min=36, tm_sec=2, tm_wday=5, tm_yday=171, tm_isdst=-1)
>>> f()
time.struct_time(tm_year=2015, tm_mon=6, tm_mday=20, tm_hour=15, tm_min=36, tm_sec=2, tm_wday=5, tm_yday=171, tm_isdst=-1)
>>> f(datetime.datetime.now())
time.struct_time(tm_year=2015, tm_mon=6, tm_mday=20, tm_hour=15, tm_min=37, tm_sec=1, tm_wday=5, tm_yday=171, tm_isdst=-1)
>>> f()
time.struct_time(tm_year=2015, tm_mon=6, tm_mday=20, tm_hour=15, tm_min=36, tm_sec=2, tm_wday=5, tm_yday=171, tm_isdst=-1)
那么为什么第四次通话会让我回到第36分钟和第2分钟 虽然在那之前打电话? 为什么前两个调用给出相同的确切时间,即使我在它们之间有足够的时间?
答案 0 :(得分:2)
正如flask所述,解析函数时会计算默认值,因此它将被设置为一次。
对此的典型解决方案是不具有默认的可变值。您可以执行以下操作:
def f(t=None):
if not t:
t = datetime.datetime.now()
return t.timetuple()
对于读者而言,顺便说一句'好处,你应该尝试使用有意义的方法和变量名。
答案 1 :(得分:1)
您可以通过在将函数加载到第二个函数时指定函数来阻止评估函数。
import datetime
def f(t = datetime.datetime.now()):
return t.timetuple()
def main(ff=f):
print ff
print ff()
>>> main()
<function f at 0x10a4e6938>
time.struct_time(tm_year=2015, tm_mon=6, tm_mday=20, tm_hour=15, tm_min=39, tm_sec=28, tm_wday=5, tm_yday=171, tm_isdst=-1)
始终在参数中评估编辑功能。解决方案:将其分配与参数
分离def f(t="now"):
if t=="now":
return datetime.datetime.now().timetuple()
else:
return t.timetuple()
def main(ff=f):
print ff
print ff()
import time
main()
time.sleep(3)
main()
答案 2 :(得分:1)
这里,可选参数现在是日期时间的函数 - 没有括号,正如@jonsharpe所推荐的那样。调用f会调用默认函数,并且调用它会返回两次不同的时间:
>>> import datetime
>>> def f(t=datetime.datetime.now):
... return t()
...
>>> f()
datetime.datetime(2015, 6, 21, 0, 6, 10, 698000)
>>> f()
datetime.datetime(2015, 6, 21, 0, 6, 12, 269000)
或者你可以传入另一个函数,这里是测试函数,并覆盖t
。调用f()调用传入的函数:
>>> def test():
... return "hi"
...
>>> f(t=test)
'hi'
答案 3 :(得分:-1)
默认参数值仅在定义函数时计算一次。