我正在运行 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 http://docs.python.org/library/weakref.html?highlight=weakref#module-weakref了解详情。当然,由于如果不以其他方式引用,所引用的对象就会消失(弱引用的全部目的而不是普通引用!-),因此如果引用对象尝试使用对象,则需要警告它那已经消失了——并且该警报正是由您所看到的异常发出的。
在你的代码中...:
def __init__(self,dbname):
tmp = sqlite.connect(dbname)
self.con = tmp.cursor()
def __del__(self):
self.con.close()
tmp
是对连接的正常引用...但它是一个局部变量,所以它在结束时消失__init__
。 (特殊命名的)光标self.con
保留,但它的内部实现仅保留对连接的弱引用,因此连接会在以下情况下消失: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 不会介意(您只会让读者感到困惑)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)