Python函数定义,函数作为可选参数

时间:2015-06-20 21:00:28

标签: python python-2.7

我想将一个函数作为可选参数 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分钟 虽然在那之前打电话? 为什么前两个调用给出相同的确切时间,即使我在它们之间有足够的时间?

4 个答案:

答案 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)

默认参数值仅在定义函数时计算一次。