python:模块中的datetime始终提供第一次调用的日期

时间:2013-09-05 11:25:43

标签: python datetime

我加载了一个具有._today()选项的模块,该模块适用于datetime,以及一个类构造函数。每30秒我用data = myModule.dataClass()重新创建我的课程。我的班级的__init__有` init (von = _today(),bis = _today(),somemore = something)'。

在我初始化脚本的那一天,一切正常;第二天,加载前一天的数据。所以日期不会更新。

请帮助:那是什么?

我有一个名为myModule的文件,如下所示:

import datetime

def _today():
# returns todays date

    todays_date = datetime.datetime.now()
    return str(todays_date.day) + '.' + str(todays_date.month) + '.' + str(todays_date.year)


class MyClass(object):

    def __init__( self, von=_today(), bis=_today(), somemore=something ):

        self.somedata = []

        self.get_data( von, bis, somemore )
        self.read_data()

此外,我有一个程序可以调用我的数据类并绘制数据:

import aLot
import myModule

def some_plotting_routine(some_data):
    ...

def main():

    while True:

        most_recent_data = myModule.MyClass(somemore=something)
        some_plotting_routine(most_recent_data)

        matplotlib.pyplot.pause(30)

当我启动代码时,例如在2013年9月5日,一切正常。情节每30秒更新一次。但是,第二天,代码每30秒更新一次,数据来自前一天,即9月5日。

如果我中断执行并输入myModule._today(),它将返回正确的当前日期,即9月6日。如果我拨打myModule.MyClass(somemore=something),我会收到旧数据,如果我拨打myModule.MyClass(von=myModule._today(),bis=myModule._today(),somemore=something),我会收到当前数据。

在下一次调用之前,我尝试过各种各样的东西`del most_recent_data'。但它无济于事。

2 个答案:

答案 0 :(得分:3)

当函数定义时,不会在调用函数时评估函数默认值。在Python加载模块的那一刻,您的默认值就会一成不变。

改为使用sentinel值:

def __init__( self, von=None, bis=None, somemore=something ):
    if von is None:
        von = _today()
    if bis is None:
        bis = _today()

现在每次调用函数时都会设置值。

请注意,您的_today()功能也可以改进;创建一个date对象,并使用date.strftime()函数格式化日期:

def _today():
    """Todays date formatted as a string"""

    todays_date = datetime.date.today()
    return todays_date.strftime('%d.%m.%Y')

这将返回 zeropadded 数字的日期;你也可以使用:

    return '{0.day}.{0.month}.{0.year}'.format(todays_date)

返回非零填充值。演示:

>>> import datetime
>>> adate = datetime.date(2013, 2, 14)
>>> adate.strftime('%d.%m.%Y')
'14.02.2013'
>>> '{0.day}.{0.month}.{0.year}'.format(adate)
'14.2.2013'

答案 1 :(得分:1)

您可以将您的功能定义为:

import time
def _today():
    return time.strftime('%d.%m.%Y')

然后,默认传递上述功能,并在__init__内调用。 (与使用哨兵的设计模式略有不同......)

def __init__(self, get_von=_today, get_bis=_today, somemore=something):
    self.von = get_von()
    self.bis = get_vis()
    # ...