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 什么都没有。
我正在通过匹配日期查找 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 什么都没有。