cPickle problems
This is going to be a pretty vague message because it involves a large block of code I'd rather avoid posting. Basically, I've been pickling a dictionary of instances of a class I've created (which contains references to other instances of other classes). At some point in the last few weeks, pickling has stopped working with the following error: Traceback (most recent call last): File "./generateTools.py", line 50, in ? proj.findVHDLfiles("vhd") File "/cygdrive/c/fpga/tools/FPGAProject.py", line 630, in findVHDLfiles cpickle.dump(filenameToClassDic,pickleFile,PICKLE_FILE_PROTOCOL) File "/usr/lib/python2.4/copy_reg.py", line 83, in _reduce_ex dict = getstate() TypeError: 'str' object is not callable Does anyone have any idea why this might be failing in this way? It's driving me crazy. If need be I can probably provide the code to the class, though it's about 1000 lines, most of which is PyParsing code. I appreciate any help you guys can provide. Jeff -- http://mail.python.org/mailman/listinfo/python-list
Re: cPickle problems
Oh, and I suppose I should provide some version information: $ python Python 2.4.3 (#1, May 18 2006, 07:40:45) [GCC 3.3.3 (cygwin special)] on cygwin Jeff Poole wrote: > This is going to be a pretty vague message because it involves a large > block of code I'd rather avoid posting. Basically, I've been pickling > a dictionary of instances of a class I've created (which contains > references to other instances of other classes). At some point in the > last few weeks, pickling has stopped working with the following error: > > Traceback (most recent call last): > File "./generateTools.py", line 50, in ? > proj.findVHDLfiles("vhd") > File "/cygdrive/c/fpga/tools/FPGAProject.py", line 630, in > findVHDLfiles > cpickle.dump(filenameToClassDic,pickleFile,PICKLE_FILE_PROTOCOL) > File "/usr/lib/python2.4/copy_reg.py", line 83, in _reduce_ex > dict = getstate() > TypeError: 'str' object is not callable > > > Does anyone have any idea why this might be failing in this way? It's > driving me crazy. If need be I can probably provide the code to the > class, though it's about 1000 lines, most of which is PyParsing code. > I appreciate any help you guys can provide. > > > Jeff -- http://mail.python.org/mailman/listinfo/python-list
Re: cPickle problems
To clutter this up with yet another message, this is what happens if I use pickle instead of cPickle. Same error, but it has more of a stack trace so someone more advanced than myself might be able to pick out what is going amiss. Traceback (most recent call last): File "./generateTools.py", line 50, in ? proj.findVHDLfiles("vhd") File "/cygdrive/c/fpga/tools/FPGAProject.py", line 631, in findVHDLfiles cpickle.dump(filenameToClassDic,pickleFile,PICKLE_FILE_PROTOCOL) File "/usr/lib/python2.4/pickle.py", line 1382, in dump Pickler(file, protocol, bin).dump(obj) File "/usr/lib/python2.4/pickle.py", line 231, in dump self.save(obj) File "/usr/lib/python2.4/pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.4/pickle.py", line 663, in save_dict self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.4/pickle.py", line 677, in _batch_setitems save(v) File "/usr/lib/python2.4/pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "/usr/lib/python2.4/pickle.py", line 433, in save_reduce save(state) File "/usr/lib/python2.4/pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.4/pickle.py", line 663, in save_dict self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.4/pickle.py", line 677, in _batch_setitems save(v) File "/usr/lib/python2.4/pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.4/pickle.py", line 614, in save_list self._batch_appends(iter(obj)) File "/usr/lib/python2.4/pickle.py", line 629, in _batch_appends save(x) File "/usr/lib/python2.4/pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.4/pickle.py", line 576, in save_tuple save(element) File "/usr/lib/python2.4/pickle.py", line 338, in save self.save_reduce(obj=obj, *rv) File "/usr/lib/python2.4/pickle.py", line 433, in save_reduce save(state) File "/usr/lib/python2.4/pickle.py", line 293, in save f(self, obj) # Call unbound method with explicit self File "/usr/lib/python2.4/pickle.py", line 663, in save_dict self._batch_setitems(obj.iteritems()) File "/usr/lib/python2.4/pickle.py", line 677, in _batch_setitems save(v) File "/usr/lib/python2.4/pickle.py", line 313, in save rv = reduce(self.proto) File "/usr/lib/python2.4/copy_reg.py", line 83, in _reduce_ex dict = getstate() TypeError: 'str' object is not callable Jeff Poole wrote: > Oh, and I suppose I should provide some version information: > > $ python > Python 2.4.3 (#1, May 18 2006, 07:40:45) > [GCC 3.3.3 (cygwin special)] on cygwin > > > Jeff Poole wrote: > > This is going to be a pretty vague message because it involves a large > > block of code I'd rather avoid posting. Basically, I've been pickling > > a dictionary of instances of a class I've created (which contains > > references to other instances of other classes). At some point in the > > last few weeks, pickling has stopped working with the following error: > > > > Traceback (most recent call last): > > File "./generateTools.py", line 50, in ? > > proj.findVHDLfiles("vhd") > > File "/cygdrive/c/fpga/tools/FPGAProject.py", line 630, in > > findVHDLfiles > > cpickle.dump(filenameToClassDic,pickleFile,PICKLE_FILE_PROTOCOL) > > File "/usr/lib/python2.4/copy_reg.py", line 83, in _reduce_ex > > dict = getstate() > > TypeError: 'str' object is not callable > > > > > > Does anyone have any idea why this might be failing in this way? It's > > driving me crazy. If need be I can probably provide the code to the > > class, though it's about 1000 lines, most of which is PyParsing code. > > I appreciate any help you guys can provide. > > > > > > Jeff -- http://mail.python.org/mailman/listinfo/python-list
Re: cPickle problems
Good idea. Well, I did that, and I found out that the object causing problems is a ParseResults object (a class from PyParsing) and that the __getstate__ member is in fact an empty string (''). I'm not sure where this leaves me... The PyParsing code clearly never creates such a member and my code never creates it. In fact, searching all the code involved (not including what is in /usr/lib/python2.4 ), shows no use of __getstate__ at all (or even the string "getstate"). Ok, I figured it out. ParseResults has the following member: def __getattr__( self, name ): if name not in self.__slots__: if self.__tokdict.has_key( name ): if name not in self.__accumNames: return self.__tokdict[name][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[name] ]) else: return "" return None So when something tries to retrieve .__getstate__, it returns an empty string. If I tell it to raise an AttributeException instead, then I get this message: TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled I think I need to talk to the author of PyParsing about this one... Thanks for your help! Jeff > Someway, self.__getstate__ is a string, not a method... > Since it fails inside a python module, you could print some debug > information to see what happens, like repr(self), type(self), > repr(getstate)... > > > > -- > Gabriel Genellina > Softlab SRL > > __ > Correo Yahoo! > Espacio para todos tus mensajes, antivirus y antispam ¡gratis! > ¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar -- http://mail.python.org/mailman/listinfo/python-list