Je suis tombé sur du code qui ne fonctionnerait plus dans python 3.6, mais qui était bon dans toutes les versions avant. J'ai découvert que le problème est en fait un champ contenant un ZipFile quelque part dans une classe. Voici un programme court qui soulève l'erreur:pickle un zipfile.ZipFile avec python> = 3.6
from pickle import dumps
import io
import zipfile
raw = b""
foo = zipfile.ZipFile(io.BytesIO(raw), mode="w")
dumps(foo)
Je reçois cette erreur:
Traceback (most recent call last):
File "bla.py", line 8, in <module>
dumps(foo)
TypeError: can't pickle _thread.RLock objects
Ainsi, le programme de test peut être encore plus court:
from pickle import dumps
import threading
dumps(threading.RLock())
Je mis au format à la fois le python 3.5 et 3.6 zipfile.py
mais ne peut pas trouver de différence par rapport au champ _lock
dans ZipFile
, donc il semble qu'il y ait des changements dans le threading
modu le - mais dans threading.py
il n'y a pas non plus de changements évidents entre les versions.
Pourquoi n'est-il plus sélectionnable? Dois-je faire quelque chose avant de pouvoir décaper un ZipFile?
Edit: ok après la recherche maintenant pendant un certain temps, je suis tombé sur cette entrée bug tracker python: https://bugs.python.org/msg284751 Pour qu'une ZipFile
est pickable en python < 3.6 est en fait le bug ... Je pense que je dois changer beaucoup de code maintenant ...