Globals read only inside a class body defined in a by-value function are not pickled (NameError after loading)
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
- #614 von @Eryx-Z — ohne Merge geschlossen
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 55/100
Rechercherichtung
Start by reading _extract_code_globals around GLOBAL_OPS in cloudpickle/cloudpickle.py, then inspect _function_getstate and the base_globals path in _function_getnewargs identified in the issue. Reproduce the provided example and check the related class-scope opcode cases across the listed Python versions. Done means the globals used by those class scopes are available after loading, with regression tests covering the reported cases.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
🤖 AI text below 🤖
A global that a by-value function reads only inside the body of a class it defines is not pickled, so the loaded function raises NameError. This happens on Python 3.11 through 3.14, with cloudpickle 3.1.2 and with master (4af5936).
import subprocess, sys
import cloudpickle
ns = {"__name__": "not_importable", "CONST": 42} # not importable, so f is pickled by value
exec("def f():\n class Rec:\n q = CONST\n return Rec.q\n", ns)
print("local:", ns["f"]())
load = "import pickle, sys; print(pickle.loads(sys.stdin.buffer.read())())"
r = subprocess.run([sys.executable, "-c", load], input=cloudpickle.dumps(ns["f"]), capture_output=True)
print("loaded:", (r.stdout or r.stderr).decode().strip().splitlines()[-1])
Output on 3.11.15, 3.12.10, 3.13.3 and 3.14.6:
local: 42
loaded: NameError: name 'CONST' is not defined
Other class-scope reads fail the same way:
- a field annotation naming a global, for example a dataclass
p: Pointdefined inside the function (measured on 3.13 and 3.14); - a class-scoped
type Inner = Galias, once its value is evaluated (measured on 3.12, 3.13 and 3.14).
Cause: _extract_code_globals only collects names from GLOBAL_OPS, which is STORE_GLOBAL, DELETE_GLOBAL and LOAD_GLOBAL (L388-L397). Inside a class scope, the compiler reads names with other opcodes (measured with dis):
- class-body statements, and annotations before 3.14, use
LOAD_NAME(3.11-3.14); - a class's
__annotate__function (3.14) and a class-scopedtypealias value (3.12+) useLOAD_FROM_DICT_OR_GLOBALS.
Suggested fix: add LOAD_NAME to GLOBAL_OPS, and also LOAD_FROM_DICT_OR_GLOBALS on 3.12+. Both consumers already keep only names present in func.__globals__, so class-local names collected this way are dropped:
_function_getstate(L734-L735);- the
base_globalspath in_function_getnewargs(L1307-L1314).
Related: #608.
- Vorherrschende Sprache
- Python
- Sterne
- 2k
- Forks
- 215
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus cloudpipe/cloudpickle
-
Bug: unguarded dict.pop() in _function_setstate causes KeyError crash on crafted pickle (regression from c6f8cd4)Evtl. vergeben @soodoku hat das vor 101 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
cloudpipe/cloudpickle#593 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
A class pickled by value before its annotations are read loses them.Evtl. vergeben @pralav-25 hat das vor 28 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 67/100
cloudpipe/cloudpickle#608 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 42/100
cloudpipe/cloudpickle#595 ·
Maintainer antworten meist innerhalb von 1 Tag
-
cloudpickle is not compatible with PyPy 7.3.22Evtl. vergeben @mattip hat das vor 3 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 65/100
cloudpipe/cloudpickle#592 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
cloudpipe/cloudpickle#589 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in cloudpipe/cloudpickle
Ähnliche Issues
-
fuzz fuzz-unconfirmed
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Maintainer antworten meist innerhalb von 1 Tag
-
ready-for-agent
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
neilsh/stunt-reel#220 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Issue]: use_fp4_cache is accepted but ignored; the launcher always writes FP8 recordsEvtl. vergeben @0z5a hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
area: cli priority: p3 size: S type: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 83/100
finos/open-resource-broker#757 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Maintainer antworten meist innerhalb von 6 Tagen