[Python-bugs-list] [ python-Bugs-451547 ] pickle / cPickle can't load lambdas
noreply@sourceforge.net
noreply@sourceforge.net
Thu, 16 Aug 2001 09:31:32 -0700
Bugs item #451547, was opened at 2001-08-16 06:33
You can respond by visiting:
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=451547&group_id=5470
Category: Python Library
Group: None
Status: Open
Resolution: None
Priority: 3
Submitted By: Gordon B. McMillan (gmcm)
Assigned to: Guido van Rossum (gvanrossum)
Summary: pickle / cPickle can't load lambdas
Initial Comment:
pickle and cPickle will happily dump a lambda, but on
load, both report:
SystemError: Failed to import class <lambda> from
module __main__
Seen on Py 2.1 & 1.5.2
>>> f = lambda x: x in (1,2,3)
>>> o = cPickle.dumps(f)
>>> f2 = cPickle.loads(o)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
SystemError: Failed to import class <lambda> from
module __main__
>>> o = pickle.dumps(f)
>>> f2 = pickle.loads(o)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "c:\python21\lib\pickle.py", line 951, in loads
return Unpickler(file).load()
File "c:\python21\lib\pickle.py", line 567, in load
dispatch[key](self)
File "c:\python21\lib\pickle.py", line 780, in
load_global
klass = self.find_class(module, name)
File "c:\python21\lib\pickle.py", line 790, in
find_class
raise SystemError, \
SystemError: Failed to import class <lambda> from
module __main__
----------------------------------------------------------------------
>Comment By: Guido van Rossum (gvanrossum)
Date: 2001-08-16 09:31
Message:
Logged In: YES
user_id=6380
I guess what you're missing is that pickling a function
doesn't pickle the bytecode! It pickles the name instead. So
a reference to "foo.bar" is pickled as "foo.bar", and the
unpickler imports bar from foo.
----------------------------------------------------------------------
Comment By: Gordon B. McMillan (gmcm)
Date: 2001-08-16 09:03
Message:
Logged In: YES
user_id=4923
Hmm. In the (simplistic) case I was trying, I can't see any
significant difference between the lambda and the
equivalent function (names differ, and the func has 2
appended & apparently unreachable bytecodes, but otherwise
the func_* and func_code.co_* attributes match). So what am
I missing?
Lowering priority - I can live without it easily enough.
But if lambda's won't load, they probably shouldn't dump.
----------------------------------------------------------------------
Comment By: Guido van Rossum (gvanrossum)
Date: 2001-08-16 08:11
Message:
Logged In: YES
user_id=6380
I think I'll have to close this with a won't fix, or "then
don't do that" resolution.
The problem is that whenever a function or class is pickled,
pickle must accept on blind faith that it can also be
unpickled. How would you check that this is indeed the case?
----------------------------------------------------------------------
You can respond by visiting:
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=451547&group_id=5470