[Python-Dev] Pickling Question
Guido van Rossum
guido@python.org
Sat, 09 Nov 2002 09:35:53 -0500
> In my pickling article [1] I looked at various ways to handle schema
> evolution issues. When it came to module name and location changes, I
> wrote the following:
>
> "A module name or location change is conceptually similar to a class
> name change but must be handled quite differently. That's because the
> module information is stored in the pickle but is not an attribute that
> can be modified through the standard pickle interface. In fact, the
> only way to change the module information is to perform a search and
> replace operation on the actual pickle file itself. Exactly how you
> would do this depends on your operating system and the tools you have
> at your disposal. And obviously this is a situation where you will want
> to back up your files in case you make a mistake. But the change should
> be fairly straightforward and will work equally well with the binary
> pickle format as with the text pickle format."
>
> I don't feel that this solution is entirely satisfactory and so I
> thought I would ask (a bit late, I know) whether I am completely
> correct in my assertions. If not, how else can this be handled. If so,
> is there any chance of adding a better way to handle this situation?
>
> [1] http://www-106.ibm.com/developerworks/library/l-pypers.html
I don't believe a search-and-replace on a pickle can ever be safe. In
a binary pickle, it might interfere with length fields. And in either
kind of pickle, you might accidentally replace data that happens to
look like a module name.
I'd suggest something else instead: when you have a pickle
referencing module A which has since been renamed to B, create a dummy
module A that contains "from B import *". Then load the pickle, and
write it back again. The loading should work because a reference to
class A.C will find it (as an alias for B.C); the storing should store
it as B.C because that's the real name of class C.
--Guido van Rossum (home page: http://www.python.org/~guido/)