Can not dump class object created on runtime

Chris Rebert clp2 at rebertia.com
Wed Jun 10 19:43:38 EDT 2009


On Wed, Jun 10, 2009 at 7:25 AM, Metal Zong<metalzong at 163.com> wrote:
> Hello,
>
> Can not dump class object created on runtime.
>
> Is there anybody can help me? Thank.
>
> Following is testing code:
>
> import pickle
> from new import classobj
>
> class A:
>     def __str__(self):
>         return self.__class__.name
>
> if __name__ == "__main__":
>     c = classobj('B', (A, ), {}) # create class obj on runtime
>     print c
>     print pickle.dumps(c) # get dump string
>
> Bellows are outputs:
>
> __main__.B
> Traceback (most recent call last):
>   File "C:\USERS\train\_work\test\test.py", line 11, in <module>
>     print pickle.dumps(c)
>   File "c:\USERS\train\Python25\lib\pickle.py", line 1366, in dumps
>     Pickler(file, protocol).dump(obj)
>   File "c:\USERS\train\Python25\lib\pickle.py", line 224, in dump
>     self.save(obj)
>   File "c:\USERS\train\Python25\lib\pickle.py", line 286, in save
>     f(self, obj) # Call unbound method with explicit self
>   File "c:\USERS\train\Python25\lib\pickle.py", line 748, in save_global
>     (obj, module, name))
> pickle.PicklingError: Can't pickle <class __main__.B at 0x00AF4CF0>: it's
> not found as __main__.B

pickle stores classes by storing their fully-qualified name (eg.
"foo.bar.Baz") and NOT by storing the internal Python structures that
represent the class (as there are apparently various problem
associated with this). So when it unpickles, it just imports the
fully-qualified name normally and returns the result of that.
Since dynamically-created classes have no fully-qualified name, they
can't be stored this way; hence, you get an exception when trying to
pickle.dump() them.

Also, you shouldn't use `classobj` as I believe that's only for
old-style classes, which are being phased out. Its replacement is the
built-in `type` metaclass, which creates new-style classes.

Cheers,
Chris
-- 
http://blog.rebertia.com



More information about the Python-list mailing list