2016-08-09 37 views
0

Ich bemerkte, dass mein Objekt einen expliziten Verweis auf ein Modul enthält, pickling es wird daher fehlschlagen.Warum können Funktionen gebeizt werden, aber keine Module?

Wenn ich jedoch stattdessen einen Verweis auf eine Funktion von diesem Modul in meinem Objekt anhefte, kann er erfolgreich ausgewählt und entkoppelt werden.

Wie kann Python Funktionen, aber nicht Module einlegen?

+0

@Tommy-Module sind Objekte – MaxB

+0

isinstance (math, object) => True – MaxB

+0

richtig, sorry. Ich habe versucht zu verstehen, was ist das erwünschte Ergebnis, ein Modul zu beizen? Der Code? Der Staat? – Tommy

Antwort

2

Weil sie keine Unterstützung dafür codierten. C-Level-Typen (und sogar Module, die in Python geschrieben sind, werden mit einem C-Level-Typ implementiert) erfordern die explizite Codierung der pickle-Unterstützung.

Es ist nicht sehr einfach zu bestimmen, was gebeizt werden soll, wenn ein module eingemischt werden darf; das Importieren des gleichen Namens auf der anderen Seite scheint einfach zu sein, aber wenn Sie tatsächlich versuchen, das Modul selbst zu beizen, wäre die Sorge, dass Sie auch den Modulstatus pürieren möchten. Es ist noch verwirrender, wenn das Modul ein C-Erweiterungsmodul ist, bei dem der Modulstatus nicht einmal Python selbst ausgesetzt ist, sondern nur intern auf der C-Ebene verwendet wird.

Vorausgesetzt, dass Sie in der Regel bestimmte Dinge aus einem Modul, nicht das gesamte Modul (die in der Regel nicht als State, nur auf der obersten Ebene importiert wird) möchten, sind die Vorteile der Unterstützung Beizen für Module begrenzt, und die Semantik sind unklar, sie haben sich nicht darum gekümmert, es umzusetzen.