A class pickled by value before its annotations are read loses them.
Les mainteneurs répondent en général sous 16 jours
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 67/100
Piste de recherche
Start in cloudpickle/cloudpickle.py at _class_getstate and _class_setstate, then compare the class annotation handling with the snapshot behavior described for #603. Reproduce with the provided Python 3.14 example, checking both unread and already-read annotations after unpickling. Done when a by-value pickled class preserves its annotations even when they had not been read before pickling.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
A summary of the problem from a bot below:
On Python 3.14, a class pickled by value before its annotations have ever been read unpickles with annotations == {}. This happens on cloudpickle 3.1.2, on #603's head (0f652a6), and on master (4af5936).
import subprocess, sys
import cloudpickle
ns = {"__name__": "not_importable"} # not importable, so the class is pickled by value
exec("class C:\n x: int\n", ns)
unread = cloudpickle.dumps(ns["C"])
ns["C"].__annotations__ # first read fills __annotations_cache__
read = cloudpickle.dumps(ns["C"])
load = "import pickle, sys; print(pickle.loads(sys.stdin.buffer.read()).__annotations__)"
for tag, blob in [("unread", unread), ("read", read)]:
out = subprocess.run([sys.executable, "-c", load], input=blob, capture_output=True, check=True)
print(tag, out.stdout.decode().strip())
Cause: _class_getstate (https://github.com/cloudpipe/cloudpickle/blob/4af5936/cloudpickle/cloudpickle.py#L792-L797) does clsdict.pop("annotate_func", None), with the comment "Python will recreate it when annotations is accessed at unpickling time". Python does not recreate it. Before the first read, the class dict holds only annotate_func, so the pickled state has no annotations at all. After a read, annotations_cache exists and survives. The note in _class_setstate (L1213 (https://github.com/cloudpipe/cloudpickle/blob/4af5936/cloudpickle/cloudpickle.py#L1213-L1215)) makes the same assumption.
#603 (crash report in #585) snapshots annotations for by-value annotate functions. The class path needs the same snapshot: in _class_getstate, evaluate the annotations (for example annotationlib.get_annotations(obj)) into annotations_cache before popping annotate_func. Dataclasses are not affected, because the decorator reads the annotations at class creation. Plain classes whose annotations are first read after pickling (typing introspection, pydantic-style consumers on the worker) lose them silently.
- Langage dominant
- Python
- Étoiles
- 1.9k
- Forks
- 206
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de cloudpipe/cloudpickle
-
Bug: unguarded dict.pop() in _function_setstate causes KeyError crash on crafted pickle (regression from c6f8cd4)Peut-être pris @soodoku l’a pris il y a 82 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
cloudpipe/cloudpickle#593 · 1 commentaire ·
Les mainteneurs répondent en général sous 16 jours
-
Globals read only inside a class body defined in a by-value function are not pickled (NameError after loading)Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 55/100
cloudpipe/cloudpickle#609 · 1 commentaire ·
Les mainteneurs répondent en général sous 16 jours
-
Difficulté 4/5 3-5 jours Accessibilité débutants 42/100
cloudpipe/cloudpickle#595 ·
Les mainteneurs répondent en général sous 16 jours
-
cloudpickle is not compatible with PyPy 7.3.22Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 65/100
cloudpipe/cloudpickle#592 · 2 commentaires ·
Les mainteneurs répondent en général sous 16 jours
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
cloudpipe/cloudpickle#589 ·
Les mainteneurs répondent en général sous 16 jours
Toutes les issues de cloudpipe/cloudpickle
Issues similaires
-
docs: the dev-setup table and AGENTS.md name the reviewed_by guard that CI's Changelog job runsOuvertearea: tools documentation good first issue ready for a contributor
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
eyalgolan/statecraft-israel#873 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Add cover art to song rowsOuverteenhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 5 jours
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
bug good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Les mainteneurs répondent en général sous 1 jour