pickle vs cPickle: error is not raised / windows vs linux?

Irmen de Jong irmen at -NOSPAM-REMOVETHIS-xs4all.nl
Sun Jun 1 03:09:15 EDT 2003


I'm experiencing  a problem with pickle vs cPickle.
The code below prints:
***pickle***
Creating t...
Thing.__init__ name= myname
Pickle t...
Restore t...
FAIL!!!  maximum recursion depth exceeded
***cPickle***
Creating t...
Thing.__init__ name= myname
Pickle t...
Restore t...
SUCCESS!!! name= myname

running with python 2.2/2.3 under windows and linux.

When I enable the __getinitargs__, I also get strange results:
- python 2.2.2 under windows tells me with pickle: FAIL!!!  __main__.Thing is 
not safe for unpickling.  (cPickle works)
- python 2.3b under windows tells me everything is fine
- python 2.2.2 *and* 2.3b under linux tell me everything is fine

(When I enable __setstate__, all cases work.)

My questions:
1) with the unmodified code, why doesn't cPickle raise an error when the 
unpickling gets in an endless loop ?
2) in the second case with __getinitargs__ enabled, why does windows tell me 
the object isn't safe to unpickle, while linux says it's all right?


Thanks for any answers!!

--Irmen


CODE:
------------------------------------
import pickle, cPickle

class Thing:
	def __init__(self,aname):
		print "Thing.__init__ name=",aname
		self.name=aname
	def __getattr__(self, attrname):
		self.name.trim()   # any method on the name attribute..
		raise AttributeError()

# enable the setstate *AND/OR* getinitargs method to make it work for pickle:
#	def __setstate__(self,args):
#		print "SETSTATE! args=",args
#		self.__dict__=args
#	def __getinitargs__(self):
#		print "GETINITARGS!"
#		return ["initname"]

def test(pickle):
	print "Creating t..."
	t=Thing("myname")
	try:
		print "Pickle t..."
		s=pickle.dumps(t)
		print "Restore t..."
		t2=pickle.loads(s)
		print "SUCCESS!!! name=",t2.name
	except Exception,x:
		print "FAIL!!! ",x

print "***pickle***"
test(pickle)

print "***cPickle***"
test(cPickle)





More information about the Python-list mailing list