【问题标题】:datetime.datetime.now() returns old valuedatetime.datetime.now() 返回旧值
【发布时间】:2015-01-08 15:12:51
【问题描述】:

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

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

如果我重新部署相同的代码并再次执行它,它会移动到 2014 年 8 月 1 日,但第二天会再次失败。

在我的开发环境中它运行良好...

为什么?感谢您的帮助!

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

【问题讨论】:

  • 这里的问题是,您在部署 .now() 并将其存储在变量中时只调用一次,然后只是重用该变量,而不是在每次添加值时调用它?...
  • 我想我在这里错过了一个细节,因为我把它称为另一种方法的一部分。所以我编辑了我的问题。你怎么看?
  • 在我看来,情况并非如此,因为在“sct”的方法声明中,它应该始终创建一个新的时间戳实例。

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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的详细解释!到目前为止,将时间戳创建移动到 mehtod 主体中解决了我的问题。我将默认值添加到方法声明的原因是我希望能够在其他日期也调用该方法,目前这并不是必需的,但将来可能会再次出现。顺便说一句,我确实删掉了这篇文章的方法,因为它很长......
  • 澄清一下,如果您在我的上一个示例中遵循def sct(from_date=None) 模式,sct 将接受不同的日期作为可选参数。然后,from_date 不会是 None,所以不会调用 datetime.datetime.now().date()。所以你可以有两种方式,将当前日期作为默认日期,并接受另一个日期作为选项。
【解决方案2】:

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

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

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

【讨论】:

  • 我做到了,明天会检查这是否有效。干杯!
猜你喜欢
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多