[Python-bugs-list] [ python-Bugs-502085 ] pickle problems (with Boost.Python)
noreply@sourceforge.net
noreply@sourceforge.net
Mon, 25 Mar 2002 16:54:11 -0800
Bugs item #502085, was opened at 2002-01-10 17:49
You can respond by visiting:
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=502085&group_id=5470
Category: Python Library
Group: Python 2.2.1 candidate
Status: Open
Resolution: None
Priority: 7
Submitted By: Ralf W. Grosse-Kunstleve (rwgk)
Assigned to: Guido van Rossum (gvanrossum)
Summary: pickle problems (with Boost.Python)
Initial Comment:
Boost.Python
(http://www.boost.org/libs/python/doc/index.html) is a
popular package for integrating Python and C++.
Boost.Python pickle support is broken when using
Python 2.2 final, but
works with Python 2.2c1.
I noticed this difference:
diff /usr/local_cci/Python-
2.2/lib/python2.2/pickle.py /usr/local_cci/Python-
2.2c1/lib/python2.2/pickle.py
26c26
< __version__ = "$Revision: 1.56 $" # Code
version
---
> __version__ = "$Revision: 1.55 $" # Code
version
166,169d165
< if issubclass(t, TypeType):
< self.save_global(object)
< return
I inserted one line in pickle.py:
% diff /usr/local_cci/Python-
2.2/lib/python2.2/pickle.py .
165a166
> print "t", t
Result:
t <extension class pickle1.world at 1400c9c08>
t
<boost::python::meta_class<boost::python::detail::exten
sion_instance> object at 0x3ffffe41ae0>
Traceback (most recent call last):
File "zi", line 9, in ?
pstr = pickle.dumps(wd)
File "pickle.py", line 974, in dumps
Pickler(file, bin).dump(object)
File "pickle.py", line 115, in dump
self.save(object)
File "pickle.py", line 216, in save
self.save_reduce(callable, arg_tup, state)
File "pickle.py", line 241, in save_reduce
save(callable)
File "pickle.py", line 167, in save
if issubclass(t, TypeType):
TypeError: issubclass() arg 1 must be a class
The following patch restores backward-compatibility:
% diff /usr/local_cci/Python-
2.2/lib/python2.2/pickle.py .
166,168c166,173
< if issubclass(t, TypeType):
< self.save_global(object)
< return
---
> try:
> issc = issubclass(t, TypeType)
> except TypeError:
> pass
> else:
> if issc:
> self.save_global(object)
> return
Remark: I also noticed that 2.2 cPickle still works
for us
(double-checked) even though the CVS logs indicate
that it was
also modified between 2.2c1 and 2.2.
Thanks,
Ralf
----------------------------------------------------------------------
>Comment By: Guido van Rossum (gvanrossum)
Date: 2002-03-25 19:54
Message:
Logged In: YES
user_id=6380
I checked in a fix on the trunk.
There's nothing I can do to get this into 2.2.1c2, but
Michael might be willing to put it in 2.2.1final. Otherwise
it should go into 2.2.2, if we ever release one.
(Sorry -- I forgot about this, and you were just a tad too
late to make the 2.2.1c2 release.)
----------------------------------------------------------------------
Comment By: Tim Peters (tim_one)
Date: 2002-03-25 18:19
Message:
Logged In: YES
user_id=31435
Boosted priority and assigned to Guido. Guido, if you want
to do something here for 2.2.1, now's the time.
----------------------------------------------------------------------
Comment By: Ralf W. Grosse-Kunstleve (rwgk)
Date: 2002-03-25 18:08
Message:
Logged In: YES
user_id=71407
python 2.2.1c1 still exhibits the problem described
in the original posting. Is this expected? Is there
still hope that the suggested fix/work-around is
considered for 2.2.1?
Thanks,
Ralf
----------------------------------------------------------------------
Comment By: Guido van Rossum (gvanrossum)
Date: 2002-01-11 13:39
Message:
Logged In: YES
user_id=6380
Ah, I didn't realize this was the old Boost. I should have
(the new one only runs on Python 2.2).
I'll think about it.
----------------------------------------------------------------------
Comment By: Ralf W. Grosse-Kunstleve (rwgk)
Date: 2002-01-11 12:17
Message:
Logged In: YES
user_id=71407
> IOW I think that the correct solution would be a change to
> Boost. But I'm open to persuasion.
In principle I agree with you, but here are a few arguments
to
justify the easy fix:
- The old Boost.Python metaclass system is a dead branch.
We would prefer to concentrate our time on the ongoing
rewrite of Boost.Python which will be fully based on
the new Python 2.2 type system.
- A significant number of people are using released versions
of Boost(.Python). If the easy fix is integrated in
Python 2.2.1,
they could continue to use what they have.
- Other people might be affected by your change. The
suggested solution
will restore backward-compatibility with more people's
existing code.
- This is more a question: can you envision that the
suggested
fix has negative side-effects?
Thanks,
Ralf
----------------------------------------------------------------------
Comment By: Guido van Rossum (gvanrossum)
Date: 2002-01-11 00:07
Message:
Logged In: YES
user_id=6380
Hm, I'm surprised that t (which was returned by
type(object)) is not considered a type. Can you explain the
Boost metaclass hierarchy a bit so that I can understand how
this can work? It was found in the ob_type slot of the
object (because that's what type() returns) so it should
look a lot like a type! Then why isn't it one?
IOW I think that the correct solution would be a change to
Boost. But I'm open to persuasion.
----------------------------------------------------------------------
You can respond by visiting:
http://sourceforge.net/tracker/?func=detail&atid=105470&aid=502085&group_id=5470