我正在运行 Python 代码并收到以下错误消息:
Exception exceptions.ReferenceError: 'weakly-referenced object no longer exists' in <bound method crawler.__del__ of <searchengine.crawler instance at 0x2b8c1f99ef80>> ignored
有人知道这是什么意思吗?
附: 这是产生错误的代码:
import sqlite
class crawler:
def __init__(self,dbname):
tmp = sqlite.connect(dbname)
self.con = tmp.cursor()
def __del__(self):
self.con.close()
crawler = crawler('searchindex.db')
最佳答案
一个普通的 AKA 强引用是一个保持被引用对象事件的引用:在 CPython 中,每个对象都会保留对其存在的(正常)引用的数量(称为它的“引用计数”或 RC)并消失一旦 RC 达到零(偶尔的世代标记和扫描通过也偶尔会垃圾收集“引用循环”)。
当您不希望一个对象仅仅因为另一个对象引用它而保持事件状态时,您可以使用“弱引用”,一种不会增加 RC 的特殊引用;见 the docs详情。当然,因为如果没有被引用,被引用的对象可以消失(弱引用的全部目的而不是正常的引用!-),如果引用对象试图使用一个对象,则需要警告它那已经消失了——并且该警报正是由您看到的异常发出的。
在您的代码中...:
def __init__(self,dbname):
tmp = sqlite.connect(dbname)
self.con = tmp.cursor()
def __del__(self):
self.con.close()
tmp
是对连接的正常引用...但它是一个局部变量,所以它在 __init__
的末尾消失。 (特别命名的)光标 self.con
保持不变,但它在内部实现为仅保存连接的 WEAK 引用,因此当 tmp
执行时连接消失。因此,在 __del__
中,对 .close
的调用失败(因为光标需要使用连接才能关闭自身)。
最简单的解决方案是以下微小的变化:
def __init__(self,dbname):
self.con = sqlite.connect(dbname)
self.cur = self.con.cursor()
def __del__(self):
self.cur.close()
self.con.close()
我也借此机会将 con 用于连接,将 cur 用于光标,但如果您热衷于交换它们,Python 不会介意(您只会让读者感到困惑)。
关于python - "weakly-referenced object no longer exists"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1482141/