首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能构建一个方法链?(method1.method2.method3 1.method 2.method 3)

为什么我不能构建一个方法链?(method1.method2.method3 1.method 2.method 3)
EN

Stack Overflow用户
提问于 2009-09-26 21:46:50
回答 2查看 260关注 0票数 0

如果我有以下代码:

代码语言:javascript
运行
复制
import sqlite
sqlite.connect('tmp.db').cursor().close()

我得到以下错误消息:

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
import sqlite
x1 = sqlite.connect('tmp.db')
x2 = x1.cursor()
x3 = x2.close()

百事大吉。为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-26 22:00:22

显然,cursor保留了对连接(self.con)的弱引用。因为您链接了函数,所以一旦实例化游标,您已经实例化的连接就超出了作用域--没有任何东西再持有对该连接的强引用,并且该连接有资格进行垃圾回收。

因此,当您尝试对游标执行close操作(进而尝试对连接执行close操作)时,该连接已经超出了作用域,并且可能已经被垃圾回收了--如果是这样,则该连接已经关闭。

如果不修改游标的源,使其包含对连接的强引用,就没有办法解决这个问题,而且也没有简单的方法来判断这样做可能会带来多少问题。(好)设计师不会在没有充分理由的情况下武断地进行弱引用。

(希望您能理解来自your last question的弱引用。)

票数 3
EN

Stack Overflow用户

发布于 2009-09-26 22:01:01

看起来,cursor()返回(并保持)对连接的弱引用,因此,当连接的强引用不在调用堆栈之外时,您的连接(connect()的结果)将不会有任何强引用。所以当close()被调用时,你的连接已经被破坏了。

第二种形式通过始终保持对你的连接的强引用来避免这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1482270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档