我加载了一个具有._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'。但它无济于事。
答案 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()
# ...