Python中文
首页
教程
问答
标签
搜索
登录
注册
阻止TextIOWrapper以Py2/Py3兼容的方式关闭GC
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我需要完成的任务:</p> <p>给定一个二进制文件,用两种不同的方式解码,提供一个<strong><code>TextIOBase</code></strong>API。理想情况下,这些后续文件可以被传递,而不需要显式地跟踪它们的寿命。在</p> <p>不幸的是,包装<code>BufferedReader</code>将 导致当<code>TextIOWrapper</code>超出范围时,该读卡器被关闭。在</p> <p>下面是一个简单的演示:</p> <pre><code>In [1]: import io In [2]: def mangle(x): ...: io.TextIOWrapper(x) # Will get GCed causing __del__ to call close ...: In [3]: f = io.open('example', mode='rb') In [4]: f.closed Out[4]: False In [5]: mangle(f) In [6]: f.closed Out[6]: True </code></pre> <p>我可以在python3中通过重写<code>__del__</code>来解决这个问题(对于我的用例来说这是一个合理的解决方案,因为我可以完全控制解码过程,我只需要在最后公开一个非常统一的API):</p> ^{pr2}$ <p>但是,这在Python 2中不起作用:</p> <pre><code>In [7]: class MyTextIOWrapper(io.TextIOWrapper): ...: def __del__(self): ...: print("I've been GC'ed") ...: In [8]: def mangle2(x): ...: MyTextIOWrapper(x) ...: In [9]: f2 = io.open('example', mode='rb') In [10]: f2.closed Out[10]: False In [11]: mangle2(f2) I've been GC'ed In [12]: f2.closed Out[12]: True </code></pre> <p>我花了一点时间看Python源代码,它在2.7和3.4之间看起来非常相似,所以我不明白为什么从<code>IOBase</code>继承的<code>__del__</code>在python2中不可重写(甚至在<code>dir</code>中可见),但似乎仍然可以执行。Python3与预期完全一致。在</p> <p>我能做些什么吗?在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>一个简单的解决方案是从函数返回变量并将其存储在脚本范围内,这样在脚本结束或对它的引用发生更改之前,它不会被垃圾回收。但可能还有其他优雅的解决方案。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
Python闭包能否存储和更改外部标量?
7 回答
python闭包行为怪异
7 回答
python闭包问题源代码编译器
7 回答
Python问gam
9 回答
Python问答游戏逻辑E
5 回答
Python问答程序。你能帮我找出哪里出了问题吗?谢谢
10 回答
Python问答程序问题与分数
4 回答
Python问题
4 回答
Python问题 | 在https://www.testdome.com开发的代码测试分数有bug吗
10 回答
Python问题,上载文件的名称和缩略图
5 回答
python问题,将img的相对url连接到绝对url
4 回答
Python问题,机械化机器人
4 回答
Python问题,用不同的模板发送大量电子邮件?
1 回答
Python问题,类型错误:“float对象不能解释为integer”。无法在“for”循环中返回函数的值
6 回答
Python问题:“overflowerr:Python int太大,无法转换为C long”
5 回答
Python问题:“空数据帧的绑定方法NDFrame.head”
1 回答
Python问题:AttributeError:'_io.TextIOWrapper'对象没有属性'split'
2 回答
Python问题:AttributeError:'dict'对象没有'upper'属性
9 回答
Python问题:CS圆7C循环,正方形普查
6 回答
Python问题:ODE系统的参数估计,例如系数是函数
4 回答