Ste*_*sop 16 python pickle python-2.x
考虑:
>>> import pickle
>>> thing = open('foobar.txt','w')
>>> pickle.dumps(thing)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/pickle.py", line 1366, in dumps
Pickler(file, protocol).dump(obj)
File "/usr/lib/python2.6/pickle.py", line 224, in dump
self.save(obj)
File "/usr/lib/python2.6/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/usr/lib/python2.6/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle file objects
Run Code Online (Sandbox Code Playgroud)
似乎完全合理 - 当然我不能腌制一个打开的文件句柄.但:
>>> pickle.dumps(thing, 2)
'\x80\x02c__builtin__\nfile\nq\x00)\x81q\x01.'
>>> pickle.loads(pickle.dumps(thing, 2))
<closed file '<uninitialized file>', mode '<uninitialized file>' at 0x7ff3c078>
Run Code Online (Sandbox Code Playgroud)
显然我可以腌制一个打开的文件,只是没有用.
这是故意的吗?它掩盖了我的代码中的一个错误,我错误地腌制了一个拥有文件的对象.在某些情况下,该对象还包含一个pyodbc
游标,结果相同.
我在PEP 307中没有看到任何关于它的内容.这只是一个疏忽,还是有一些重要的事情我会失踪,这可以让我得到我想要的例外,即使在使用协议2进行酸洗时也是如此?
我正在使用Python 2.6.5.我知道,我知道,但这就是我的发行版.
agf*_*agf 10
它说,在Python Wiki上
您无法挑选打开的文件对象,网络连接或数据库连接.当你考虑它时,它是有道理的 - 当你取消对象时,pickle不能存在文件对象的连接,并且创建该连接的过程超出了pickle可以自动为你做的事情.如果你真的想腌制的东西,有是导致问题的属性,看看对于泡菜的文档
__getstate__
,__setstate__
以及__getinitargs__
-使用这些可以排除问题的属性.
但是,我发现这个错误报告表明你实际上可以腌制文件对象.这似乎是无意的.它已在Python 3.2中修复.
如果你想阻止它发生,你可以看看你是否可以将该补丁改编为Python 2.6.否则,你只需要小心你所腌制的东西.
归档时间: |
|
查看次数: |
2244 次 |
最近记录: |