From: nr n. <new...@ho...> - 2003-09-09 02:28:13
|
Hello, I'm running into problems trying pickle/unpickle instances of the following nested-class sample: class A: class A1: def __init__(self, name): self.name = name def __init__(self, name): self.createChild(name) def createChild(self, name): self.child = A1(name) # create an instance... a = A("foo") # pickle it... f = open(..., "w") pickle.dump(a, f) f.close() All fine so far. However, loading is a problem: f = open(..., "r") b = pickle.load(f) <error> basically says it couldn't import the class A1 I looked at the contents of the dumped file, and see that inner class names are not decorated with those of containing classes, thus it's understandable that unpickling fails. In fact, python docs at http://www.python.org/doc/current/lib/node64.html , "3.14.4 What can be pickled and unpickled?" state that pickleable classes are "classes that are defined at the top level of a module". Surprisingly, however, the docs also say that python raises an exception if a passed-in object may not be pickled. Perhaps it doesn't apply pickleability-tests on contained objects? Then I tried munging the pickled file to manually decorate inner-class names so that A1(...) read A.A1(...). Unfortunately that didn't work, so I guess there's no namespace searching during unpickling. So short of writing my own repr-based mechanism or some such, is there an easy way I could use inner classes with pickle? Some incantation that, for a short duration, makes inner classes available at top-level scope? Thanx --A _________________________________________________________________ MSN 8 helps eliminate e-mail viruses. Get 2 months FREE*. http://join.msn.com/?page=features/virus |
From: Michel P. <mi...@di...> - 2003-09-11 21:47:34
|
On Monday 08 September 2003 21:27, nr nr wrote: > Hello, > > I'm running into problems trying pickle/unpickle instances of the follo= wing > nested-class > I looked at the contents of the dumped file, and see that inner class n= ames > are not decorated with those of containing classes, thus it's > understandable that unpickling fails. In fact, python docs at > http://www.python.org/doc/current/lib/node64.html , "3.14.4 What can be > pickled and unpickled?" state that pickleable classes are "classes that= are > defined at the top level of a module". > If you read further down that same web page the reason why you can't pick= le or=20 unpickle non-top-level functions or classes is explained: """ Similarly, classes are pickled by named reference, so the same restrictio= ns in=20 the unpickling environment apply. Note that none of the class's code or d= ata=20 is pickled, so in the following example the class attribute attr is not=20 restored in the unpickling environment:=20 class Foo: attr =3D 'a class attr' picklestring =3D pickle.dumps(Foo) These restrictions are why picklable functions and classes must be defin= ed in=20 the top level of a module.=20 """ > Surprisingly, however, the docs also say that python raises an exceptio= n if > a passed-in object may not be pickled. Perhaps it doesn't apply > pickleability-tests on contained objects? It doesn't see them at all because classes are not pickled, only a named=20 reference to them exists, so it does not apply that test. > Then I tried munging the pickled file to manually decorate inner-class > names so that A1(...) read A.A1(...). Unfortunately that didn't work, = so I > guess there's no namespace searching during unpickling. No classes or class attributes are pickled, only their fully qualified na= me is=20 used as a reference from the pickled instance to the class. I'm not sure= why=20 you want to use nested classes, I've never seen any compelling use for th= em=20 in Python. I can understand Java programmers wanting to use them out of=20 habit, but it is a very uncommon pattern in Python. > So short of writing my own repr-based mechanism or some such, is there = an > easy way I could use inner classes with pickle? Some incantation that,= for > a short duration, makes inner classes available at top-level scope? Nope. Pickling classes and all of their attributes is a whole nother pro= blem. =20 Although Zope is pushing some of these boundaries with persistent modules= , I=20 do not know if it handles nested classes or functions. -Michel |