2015-01-08 157 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