2017-06-11 1 views
0

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 ...

Répondre

0

Juste pour donner une réponse à cette question: Que les objets ZipFile sont sélectionnables est en fait un bug: https://bugs.python.org/msg284751 qui a été corrigé dans py 3.6.