datetime.datetime.now()返回旧值

nou*_*ame 2 python google-app-engine datetime google-cloud-datastore

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

例如,当我上传我的代码并在07-01-2014执行它时,它返回07-01-2014的值,但是在08-01-2014的第二天它仍然返回07-01-2014.

如果我重新部署相同的代码并再次执行它,则会转到08-01-2014,但第二天将再次失败.

在我的开发环境中它工作得很好......

为什么?谢谢你的帮助!

class ClosingValueHandler(webapp2.RequestHandler):
    def get(self):
        sct()
Run Code Online (Sandbox Code Playgroud)

(......)

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
Run Code Online (Sandbox Code Playgroud)

zeh*_*ard 7

正如@ blackbullet4749所提到的那样,这段代码会导致您出现问题:

def sct(from_date=datetime.datetime.now().date()):
    value = getValueByDate(from_date)
Run Code Online (Sandbox Code Playgroud)

具体来说,您希望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
Run Code Online (Sandbox Code Playgroud)

无论你在那个被打印出来的元组中看到的是"from_date"值,它会在你的代码中被重用.

如果您希望能够使用默认行为调用该函数,即它需要当前时间,但是使用覆盖选项,则执行以下操作:

def sct(from_date=None):
    if from_date is None:
        from_date = datetime.datetime.now().date()
    value = getValueByDate(from_date)
Run Code Online (Sandbox Code Playgroud)

有关默认参数值的更多详细信息,请参阅此effbot帖子.

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