2015-01-08 111 views
2

我正在通過匹配日期查找python中的數據存儲區條目。我想要的是每天選擇「今日」的條目。但由於某種原因,當我將代碼上傳到gae服務器時,它只會工作一天,並在第二天仍然返回相同的值。datetime.datetime.now()返回舊值

例如當我上傳我的代碼並在07-01-2014執行它將返回07-01-2014的值,但第二天08-01-2014它仍然返回07-01-2014。

如果我重新部署相同的代碼並再次執行,它將轉移到08-01-2014,但在第二天再次失敗。

在我的開發環境中,它工作正常...

爲什麼?謝謝你的幫助!

class ClosingValueHandler(webapp2.RequestHandler): 
    def get(self): 
     sct() 

(...)

def sct(from_date=datetime.datetime.now().date()): 
    value = getValueByDate(from_date) 

def getValueByDate(date): 

    query = "SELECT * FROM Value WHERE date = DATE('%s')" % str(date) 
    try: 
     q = db.GqlQuery(query) 
     value = q.get() 

    except Exception as e: 
     logging.error("Could not fetch Value value for date '%s' \n Error message: %s \n" % (str(date), str(e))) 
     return 

    return value 
+0

這裏的問題是,只有在調用.now()時才調用.now()一次,並將其存儲在一個變量中,然後重用該變量,而不是在每次添加值時都調用它? – LexyStardust

+0

我想我在這裏錯過了一個細節,我稱之爲另一種方法的一部分。所以我編輯了我的問題。你怎麼看? – nouseforaname

+0

在我看來,情況並非如此,因爲在「sct」的方法聲明中,它應該始終創建一個新的時間戳實例。 – nouseforaname

回答

6

正如@ blackbullet4749提到,它的代碼,導致您的問題該位:

def sct(from_date=datetime.datetime.now().date()): 
    value = getValueByDate(from_date) 

具體來說,你希望這個代碼運行datetime.datetime.now().date()每次調用該函數的時間。

究竟發生了什麼datetime.datetime.now().date()運行一次,而不是當該函數被調用,但是當它是第一次定義的 - 也就是說,當函數對象被實例化。當執行你的代碼時,Python實際上運行這些代碼行並創建一個函數對象,就像任何其他對象一樣存在。默認參數存在於作爲函數對象的屬性指定的元組中。

要看到自己這一點,試試這個:

def sct(from_date=datetime.datetime.now().date()): 
    value = getValueByDate(from_date) 

print sct.func_defaults 

無論你在被打印出來是保持在你的代碼被重用了「FROM_DATE」值的元組看到的。

如果你想能夠調用與默認行爲的就是它的當前時間的功能,但覆蓋的選項,然後做到這一點,而不是:

def sct(from_date=None): 
    if from_date is None: 
     from_date = datetime.datetime.now().date() 
    value = getValueByDate(from_date) 

有關默認的詳細信息參數值,請參閱effbot post

順便說一句,不知道這個功能應該做什麼。似乎沒有任何回報。

+0

非常感謝您的詳細解釋!將時間戳創建移至mehtod身體至今解決了我的問題。我之所以將默認方法添加到方法聲明中,是因爲我希望能夠在其他日期中調用該方法,但目前並不是必須的,但未來可能會再次出現。順便說一句,我確實削減了這篇文章的方法,因爲它很長... – nouseforaname

+1

只是爲了澄清,如果你在我的最後一個例子中遵循'def sct(from_date = None)'模式,'sct'將接受不同的日期作爲一個可選參數。然後,'from_date'不會是'None',所以'datetime.datetime.now()。date()'不會被調用。所以你*可以*有兩種方式,將當前日期作爲默認值,並接受另一個日期作爲選項。 – zehnpaard

0

看來,這只是在應用程序的部署得到的日期時間。將from_date = datetime.datetime.now()。date()從定義中移出到函數體中,看看是否有效。

def sct(self): 
    from_date=datetime.datetime.now().date() 
    value = getValueByDate(from_date) 

看看是否改變你的結果。當你在一個函數之外設置一個值時,通常會發生這種情況,因爲它在應用程序重新啓動之前從不再被調用。

+0

我做到了,並會明天檢查這是否正常。乾杯! – nouseforaname