Pedantic pickling error after reload?
Diez B. Roggisch
deets at nospam.web.de
Thu Feb 25 14:28:26 EST 2010
Am 25.02.10 18:08, schrieb Robert:
> After (intended/controlled) reload or similar action on a module/class
> the pickle/cPickle.dump raises errors like
>
> pickle.PicklingError: Can't pickle <class 'somemodule.SomeClass'>: it's
> not the same object as somemodule.SomeClass
>
>
> Cause in pickle.py (and cPickle) is a line
> "if klass is not obj:"
>
> Shouldn't it be enough to have "if klass.__name__ != obj.__name__:" there?
No. This would alias classes of same name, but living in different modules.
So at least you need to compare these, too. I'm not sure if there aren't
even more corner-cases. Python's import-mechanism can sometimes be
rather foot-shoot-prone.
> => a bug report/feature request?
>
> Classes can change face anyway during pickled state, why should a
> over-pedantic reaction break things here during runtime?
> (So far I'd need to walk the object tree in all facets and save against
> inf loops like pickle himself and re-class things .. )
If anything it's a feature - and I doubt it's really needed. Because
reloading pickles with intermittend reload-module-operations is to rare
a case to be really supported IMHO.
Do yourself a favor, write a unit-test that tests the desired behavior
that makes you alter your code & then reload. This makes the problem go
away, and you have a more stable development through having more tests :)
Diez
More information about the Python-list
mailing list