【问题标题】:Python Function Caching?Python函数缓存?
【发布时间】:2012-06-26 07:28:24
【问题描述】:

我在 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

我意识到检查时间的方式有点矫枉过正,但这是我功​​能的简化版本。我的实际功能还包括一堆时区转换,这使得上述操作变得必要。

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

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)

这在一周内完美运行,每周晚上停止并在第二天早上继续。然而,在周末,它并没有从长时间的休息中“恢复”。换句话说,isTime 永远不会在星期一早上返回 True

我检查了日志,脚本每 10 秒打印一次“活动”,但数据抓取部分从未发生(并且“它的时间”从未打印)。因此,我假设这意味着 isTime 正在返回 False

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

当我生成相同的代码实例,而主脚本仍在错误模式下运行,isTime 返回False,新实例从isTime 获取True 并开始正常工作。

发生了什么事?

【问题讨论】:

    标签: python function caching return


    【解决方案1】:

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

    def isTime(utc_now=datetime.datetime.utcnow()):
    

    当它运行时,utc_now 的默认值设置为当时的时间,并且永远不会重新计算。

    【讨论】:

      【解决方案2】:

      默认参数在编译时计算。设置默认值None,并使用is None 进行检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-07
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2012-08-31
        • 2017-10-20
        相关资源
        最近更新 更多