Python函数缓存?

use*_*786 2 python caching return function

我在Python中遇到了一个非常奇怪的情况.

while True:在脚本中有一个循环,不断抓取实时数据.这些数据仅用于在工作时间内获取,因此我在一个名为的模块中有一个辅助函数lib/date.py.

这是功能:

def isTime(utc_now=datetime.datetime.utcnow()): 
    '''
    9:00 AM UTC - 5:00 PM UTC Mon - Fri.

    The parameter utc_now can be used to specify a specific     
    datetime to be checked instead of the utcnow(). 
    '''

    week_day = utc_now.weekday()

    # no good on Saturdays and Sundays
    if 5 == week_day or 6 == week_day:
        return False

    now_int = (utc_now.hour * 60) + utc_now.minute

    if (17 * 60) >= now_int >= (9 * 60):
        return True

    return False
Run Code Online (Sandbox Code Playgroud)

我意识到检查时间的方式是一种矫枉过正,但这是我的功能的简化版本.我的真正功能还包括一堆时区转换,这些转换使上述必要.

这是我的主要脚本(简化):

def main():
    while True:
        do_ten_seconds()

def do_ten_seconds():
    log.info("alive")

    for i in xrange(10):   
        if isTime():
            log.info("its time")
            # do data grabbing
        sleep(1)
Run Code Online (Sandbox Code Playgroud)

这在一周内完美运行,每周晚上停止,第二天早上继续.然而,在周末,它不会从长假中"恢复".换句话说,周一早上isTime永远不会回来True.

我检查了日志,脚本每隔10秒打印一次"活着",但数据抓取部分从未发生(并且"它的时间"从未打印过).因此,我假设这种方式isTime正在回归False.

可能是因为该函数在周末频繁调用,并且因为它False连续多次返回,Python会缓存结果而永远不会从中恢复?

当我生成相同的代码实例而主脚本仍然在isTime返回的错误模式下运行时False,新实例True将从中isTime开始并完全开始工作.

到底是怎么回事?

Woo*_*ble 5

第一次导入date.py时,以下行运行一次:

def isTime(utc_now=datetime.datetime.utcnow()):
Run Code Online (Sandbox Code Playgroud)

运行时,默认值utc_now设置为该时刻的时间,永远不会重新计算.