gpt4 book ai didi

python - 除非我重置内核,否则 Jupyter Notebook 中的对象不是 "resetting"

转载 作者:行者123 更新时间:2023-12-02 15:02:45 25 4
gpt4 key购买 nike

这是一个奇怪的问题,我不完全确定如何恰本地提出它,但我会尽力而为。

我有一个自定义类,它基本上是一个 API 的包装器,它在每次调用时用新数据更新 SQLite 数据库(我无法将它添加到问题中,因为它很大且私有(private))。

奇怪的是,似乎有一些信息被缓存了(我不认为这是可能的,但这是唯一让我想起的事情,比如当你在 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() 函数时,end 参数没有被更新(我认为它会在每次调用时更新到当前时间)作为默认 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

最佳答案

您的问题与您的一种方法中参数的默认值有关:

def get_data(self, start, end = int(datetime.now().timestamp() * 1000)):
...

默认值不会在每次调用函数时重新计算。相反,作为默认值给出的表达式仅在定义方法时计算一次,并且存储该值以用作所有以后调用的默认值。这在这里不起作用,因为它仅在加载模块时计算 datetime.now,而不是在每次调用函数时计算。

解决此问题的常用方法是将标记值设置为默认值,如 None,然后在找到标记后在函数内部计算适当的值:

def get_data(self, start, end=None):
if end is None:
end = int(datetime.now().timestamp() * 1000)
...

关于python - 除非我重置内核,否则 Jupyter Notebook 中的对象不是 "resetting",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48593034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com