1

我加载了一些模块,该模块有一个._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”。但这无济于事。

4

2 回答 2

3

函数默认值是在定义函数时计算的,而不是在调用它时计算的。在 Python 加载模块时,您的默认值是一成不变的。

改为使用标记值:

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')

这将返回带有零填充数字的日期;你也可以使用:

    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'
于 2013-09-05T11:27:51.640 回答
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()
    # ...
于 2013-09-05T11:40:41.440 回答