datetime.datetime.now() returns 旧值

datetime.datetime.now() returns old value

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

例如当我上传我的代码并在 07-01-2014 执行它时,它 returns 07-01-2014 的值但第二天在 08-01-2014 它仍然 returns 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

它似乎只是在部署应用程序时获取日期时间。将 from_date=datetime.datetime.now().date() 从定义中移到函数体中,看看是否可行。

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

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

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

顺便说一句,不确定这个函数应该做什么。似乎 return 什么都没有。