On Wed, Jun 10, 2009 at 7:25 AM, Metal Zong<metalz...@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 -- http://mail.python.org/mailman/listinfo/python-list