用 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 中修复。