2012-06-25 43 views
2

我遇到了Python中非常奇怪的情況。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並開始正常工作。

這是怎麼回事?

回答

2

默認參數計算在編譯時間。設置默認值None,並檢查使用is None

+0

很酷 - 非常感謝你! – user1094786

5

導入date.py第一次,下面的行運行一次:

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

當它運行,爲utc_now的默認值是在那個時刻設置的時間,並且永遠不會重新計算。