用 python >= 3.6 腌制 zipfile.ZipFile
pickle a zipfile.ZipFile with python >= 3.6
我发现一些代码在 python 3.6 中不再有效,但在之前的所有版本中都很好。我发现问题实际上是 class 中某处包含 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
进行了区分,但无法发现 ZipFile
中 _lock
字段的任何差异,所以似乎有是 threading
模块中的变化 - 但在 threading.py
中,版本之间也没有明显变化。
为什么它不能再被采摘了?在腌制 ZipFile 之前我需要做些什么吗?
编辑:好的,现在搜索一段时间后,我偶然发现了这个 python 错误跟踪器条目:https://bugs.python.org/msg284751
所以 ZipFile
在 python 中是可选的 <3.6 实际上是错误......
我想我现在需要更改很多代码...
只是为了回答这个问题:ZipFile 对象是可拾取的实际上是一个错误:https://bugs.python.org/msg284751 已在 py 3.6 中修复。
我发现一些代码在 python 3.6 中不再有效,但在之前的所有版本中都很好。我发现问题实际上是 class 中某处包含 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
进行了区分,但无法发现 ZipFile
中 _lock
字段的任何差异,所以似乎有是 threading
模块中的变化 - 但在 threading.py
中,版本之间也没有明显变化。
为什么它不能再被采摘了?在腌制 ZipFile 之前我需要做些什么吗?
编辑:好的,现在搜索一段时间后,我偶然发现了这个 python 错误跟踪器条目:https://bugs.python.org/msg284751
所以 ZipFile
在 python 中是可选的 <3.6 实际上是错误......
我想我现在需要更改很多代码...
只是为了回答这个问题:ZipFile 对象是可拾取的实际上是一个错误:https://bugs.python.org/msg284751 已在 py 3.6 中修复。