pickle一个zipfile.ZipFile与python> = 3.6

时间:2017-06-11 15:30:48

标签: python-3.x pickle

我遇到了一些在python 3.6中不再起作用的代码,但在之前的所有版本中都表现不错。我发现问题实际上是一个包含类中某个ZipFile的字段。这是一个引发错误的简短程序:

from pickle import dumps
import io
import zipfile

raw = b""

foo = zipfile.ZipFile(io.BytesIO(raw), mode="w")
dumps(foo)

我收到此错误:

Traceback (most recent call last):
  File "bla.py", line 8, in <module>
    dumps(foo)
TypeError: can't pickle _thread.RLock objects

所以测试程序可以更短:

from pickle import dumps
import threading

dumps(threading.RLock())

我对python 3.5和3.6 zipfile.py都进行了区分,但是对于_lock中的ZipFile字段没有发现任何差异,所以似乎threading中有变化1}}模块 - 但在threading.py中,版本之间也没有明显的变化。

为什么它不再可摘?在我可以挑选ZipFile之前,我是否需要做些什么?

编辑:好了,现在搜索了一会儿,我偶然发现了这个python bug跟踪器条目:https://bugs.python.org/msg284751 因此,ZipFile可以在python中选择&lt; 3.6实际上是错误... 我想我现在需要改变很多代码......

1 个答案:

答案 0 :(得分:0)

只是回答这个问题:ZipFile对象是可选择的实际上是一个错误:https://bugs.python.org/msg284751已在py 3.6修复。