【发布时间】:2018-07-13 13:34:41
【问题描述】:
这是一个奇怪的问题,我不完全确定如何恰当地提出这个问题,但我会尽力而为。
我有一个自定义类,它基本上是一个 API 的包装器,它在每次调用时使用新数据更新 SQLite 数据库(我无法将它添加到问题中,因为它是庞大且私有的)。
奇怪的是,似乎某些信息正在被缓存(我认为这是不可能的,但这是唯一让我想起的事情,例如当您在 web dev 中进行编辑并且它们没有更新时),因为它第一次工作,但是当我尝试重新初始化对象并再次运行它时,它不会向数据库添加任何新数据(当我知道要添加新数据时)。
我知道代码有效,因为如果我重新启动内核并再次运行它,它会更新没有问题。
我已尝试删除对象 (del InitializedClass)、重新初始化并使用不同的值进行初始化,但似乎没有任何效果。除非重新启动内核,否则它不会更新数据库。
有人遇到过这样的问题吗?如果这还不够,我很乐意提供更多信息,但我不知道如何描述它。
谢谢!!
编辑
下面的伪代码基本上就是发生了什么
from something import SomeClass
while True:
obj = SomeClass() # <--------- How can I "reset" this on each loop?
obj.get_new_data_from_api()
obj.update_raw_db()
obj.process_raw_data()
obj.update_processed_db()
# i tried different combinations of deleting the object
del obj
del SomeClass
from something import SomeClass
编辑 2:
所以正如大家提到的,这是类本身的问题,但我仍然不明白为什么会发生错误。基本上,当我将 datetime.now() 函数调用作为默认 kwarg 时(即使在删除类并创建了一个新实例,这没有更新)。问题如下图所示:
class SomeBrokenClass():
def __init__(self):
pass
def get_endpoint(self, start, end):
return 'https://some.api.com?start_date=%s&end_date=%s' % (start, end)
# THE PROBLEM WAS WITH THIS METHOD ( .get_data() ):
# When re-initializing the class, the `end` argument
# was not being updated for some reason. Even if I completely
# delete the instance of the class, the end time would not update.
def get_data(self, start, end = int(datetime.now().timestamp() * 1000)):
return pd.read_json(self.get_endpoint(start, end))
def get_new_data_from_api(self):
start_date = self.get_start_date()
df = self.get_data(start_date)
return df
class SomeWorkingClass():
def __init__(self):
pass
def get_endpoint(self, start, end):
return 'https://some.api.com?start_date=%s&end_date=%s' % (start, end)
def get_data(self, start, end):
return pd.read_json(self.get_endpoint(start, end))
def get_new_data_from_api(self):
start_date = self.get_start_date()
end_date = int(datetime.now().timestamp() * 1000) # BUT THIS WORKS FINE
df = self.get_data(start_date, end_date)
return df
【问题讨论】:
-
很可能是您的代码,我们看不到,所以不确定您希望如何获得帮助?
-
但是为什么每次内核重启都能正常运行的代码呢?
-
"但是为什么每次内核重启都能正常工作的代码呢?" - 我不知道答案,但这可能是您代码中的错误。我建议您将代码简化为显示问题的工作示例。
-
@MitchWheat 好的,我尝试更新基本情况
-
@MitchWheat 我想我主要要问的是,不应该删除对象然后重新初始化它与重新启动内核做同样的事情吗?是否可以将信息缓存在笔记本中?
标签: python python-3.x class ipython jupyter-notebook