datetime.datetime.now()返回旧值

时间:2015-01-08 15:12:51

标签: python google-app-engine datetime google-cloud-datastore

我通过匹配日期在python中查找数据存储区条目。我想要的是选择"今天"在每一天。但出于某种原因,当我将我的代码上传到gae服务器时,它只能工作一天,第二天它仍会返回相同的值。

e.g。当我上传我的代码并在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

2 个答案:

答案 0 :(得分:7)

正如@ 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

顺便说一句,不知道这个函数应该做什么。似乎没有任何回报。

答案 1 :(得分:0)

看起来它只是在部署应用程序时获得日期时间。将from_date = datetime.datetime.now()。date()从定义中移到函数体中,看看是否有效。

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

看看是否会改变你的结果。当您在函数外部设置一个值时,通常会发生这种情况,因为在应用程序重新启动之前,它永远不会再次调用。