2009-09-26 57 views
0

如果我有以下代码:为什么我不能建立一系列方法? (method1.method2.method3)

import sqlite 
sqlite.connect('tmp.db').cursor().close() 

我收到以下错误信息:

Traceback (most recent call last): 
    File "searchengine2.py", line 13, in ? 
    sqlite.connect('tmp.db').cursor().close() 
    File "/usr/lib64/python2.4/site-packages/sqlite/main.py", line 280, in close 
    if self.con and self.con.closed: 
ReferenceError: weakly-referenced object no longer exists 

但是,如果我以下列方式修改代码:

import sqlite 
x1 = sqlite.connect('tmp.db') 
x2 = x1.cursor() 
x3 = x2.close() 

一切都很好。为什么?

回答

3

显然,cursor保持弱引用到连接(self.con)。因为你链功能,当您通过实例连接超出范围,只要你实例化光标 - 没有持有参考连接了,并且连接是符合垃圾回收。

因此,你的时间尝试close光标(这反过来又试图close连接),连接已经超出了范围,并可能已被垃圾回收 - 如果是,那么,连接已经关闭。

没有办法解决这个问题,如果不修改游标的源代码来使它拥有强大的连接引用,并且没有简单的方法来告诉如果你这样做可能会引入多少问题。 (好)设计师不要在没有充分理由的情况下擅自制作弱引用。

(希望你从your last question理解弱引用。)

+0

@马克,良好的诊断,但移动到弱裁判选择在pysqlite发行说明历史上是有据可查的:很简单,用光标必须连接强引用,但当然有时保持连接活着对程序员'的愿望,所以决定使用弱裁判 - 这里没有神秘;-)。 – 2009-09-27 00:17:00

+0

我其实没有抬头为何/是否使用弱引用任何硬数据。感谢您确认我的怀疑:) – 2009-09-27 02:03:41

1

它看起来像cursor()回报率(并保持)一个弱引用的连接,这样的话,当强引用您的连接是断开的调用堆栈,您的连接(connect()的结果)没有任何强引用。因此,在调用close()时,您的连接已被破坏。

第二种形式通过保持很强的参考周围的整个时间的连接避免这一点。

相关问题