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

2024-09-30 16:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个函数作为可选参数 在python中使用另一个函数,但我不清楚如何做到这一点。你知道吗

例如,我定义了以下函数:

import os, time, datetime

def f(t=datetime.datetime.now()):
    return t.timetuple()

我已经把t=datetime.datetime.now() 为了使参数是可选的,所以 能够在没有参数的情况下调用f()。你知道吗

现在每当我执行f()时,我得到相同的datetime A(根据我的预期,这是错误的),但是每当我执行f(datetime.datetime.now())时,我得到不同的datetime(正如预期的那样正确)。你知道吗

例如

>>> 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秒 在那之前打电话的时候? 为什么前两个电话给出相同的准确时间,即使我让他们之间有足够的时间?你知道吗


Tags: 函数datetimetimesecminyearnowstruct
3条回答

正如flask所提到的,解析函数时会计算默认值,因此它将被设置为一次。你知道吗

对此的典型解决方案是不将默认值设为可变值。您可以执行以下操作:

def f(t=None):
    if not t:
        t = datetime.datetime.now()
    return t.timetuple()

顺便说一句,为了读者的利益,您应该尝试使用有意义的方法和变量名。你知道吗

在将函数加载到第二个函数中时,可以通过指定函数来防止对函数求值。你知道吗

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()

在这里,可选参数是datetime now的函数,没有括号,正如@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'

相关问题 更多 >