我正在运行Python代码,我收到以下错误消息:
Exception exceptions.ReferenceError: 'weakly-referenced object no longer exists' in <bound method crawler.__del__ of <searchengine.crawler instance at 0x2b8c1f99ef80>> ignored
Run Code Online (Sandbox Code Playgroud)
有谁知道这意味着什么?
PS这是产生错误的代码:
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')
Run Code Online (Sandbox Code Playgroud)
Ale*_*lli 32
正常的AKA强引用是使引用对象保持活动的引用:在CPython中,每个对象保持存在的(正常)引用的数量(称为"引用计数"或RC),并且尽快消失RC达到零(偶尔的世代标记和扫描通道也会偶尔垃圾收集"参考循环").
当你不希望一个对象只是因为另一个引用它而保持活着时,那么你使用一个"弱引用",一种不增加RC的特殊引用; 有关详细信息,请参阅文档.当然,由于引用的对象如果没有另外引用就会消失(弱引用的整个目的而不是正常的引用! - ),如果它试图使用一个对象,则需要警告引用对象那已经消失了 - 而且这个警报完全由您所看到的例外情况给出.
在你的代码......:
def __init__(self,dbname):
tmp = sqlite.connect(dbname)
self.con = tmp.cursor()
def __del__(self):
self.con.close()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
我也考虑使用CON连接和CUR对光标的机会,但如果你是热衷于交换的(你就离开困惑的读者;-) Python会不会介意.
| 归档时间: |
|
| 查看次数: |
20475 次 |
| 最近记录: |