gpt4 book ai didi

datalore - 不能在定义它的单元格之外使用对象 "aaa"

转载 作者:行者123 更新时间:2023-12-04 08:26:12 26 4
gpt4 key购买 nike

我在 datalore.jetbrains.com 中使用了 datalore 内核.在我的笔记本中有 3 个以下单元格(这是我能够重现此错误的最小工作示例):

#%%
class MyClass:
def __getattribute__(self, name):
return 123
#%%
aaa = MyClass()
#%%
aaa

当我尝试执行第三个单元格时出现错误,不能在定义它的单元格之外使用对象“aaa”。该消息清楚地暗示变量 aaa 只能在第二个单元格内使用。但是为什么datalore内核会有这样的限制呢?

最佳答案

简短的回答是,Datalore 内核在执行单元后保存在磁盘运行时环境中。

为什么datalore内核需要这么做?长答案来了。为了了解问题的根本原因,我们需要知道数据内核如何执行单元。

如果我们忘记关于 Jupyter 内核的所有知识,就会更容易掌握它。 Datalore 内核与 Jupyter 内核截然不同,因为它是可重现增量

可重复性

您是否曾经遇到过这样的情况,您需要从一开始就重新运行 notebook 中的所有单元格,因为您忘记了单元格的执行顺序?您是否曾与某人共享笔记本以及描述单元格执行顺序的笔记?使用 datalore 内核,您不需要做任何类似的事情。它确保始终以完全相同的顺序评估单元格,即按照它们在笔记本中定义的顺序。每当您执行第 N 个单元时,datalore 内核会自动计算之前的所有单元。您可能认为它一定非常慢,但事实并非如此。这将我们带到了内核的第二个关键属性。

增量

Datalore 内核将每个单元执行的结果保存在磁盘上。结果只是一个运行时环境。它实际上只是对象及其名称的字典。这就是为什么 datalore 内核不需要重新计算未更改的单元格的原因,因为结果是已知的——它保存在磁盘上。因此,在典型的真实世界情况下,当您使用一个单元格并时不时地运行该单元格时 - 不会重新计算以前的单元格(仅在第一次)。此属性自然会施加以下限制:如果您想在多个单元格中使用您的对象,则需要使其可序列化。在相反的情况下,您只能在一个单元格中使用一个对象。

附言在此特定示例中,问题是由 __getattribute__ 方法的不正确实现引起的。这样的实现意味着每次调用 getattr(aaa, attr_name, None) 都会返回 123,这显然不是在所有情况下都能正常工作。这就是为什么在尝试序列化对象 aaa 时发生了一些错误,因此它没有保存在磁盘上。

关于datalore - 不能在定义它的单元格之外使用对象 "aaa",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65248865/

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