This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: pickle problems (with Boost.Python)
Type: Stage:
Components: Library (Lib) Versions: Python 2.2
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: gvanrossum Nosy List: brandon-rhodes, gvanrossum, mwh, rwgk, tim.peters
Priority: high Keywords: patch

Created on 2002-01-10 22:49 by rwgk, last changed 2022-04-10 16:04 by admin. This issue is now closed.

Messages (8)
msg8702 - (view) Author: Ralf W. Grosse-Kunstleve (rwgk) Date: 2002-01-10 22:49
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
msg8703 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2002-01-11 05:07
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.
msg8704 - (view) Author: Ralf W. Grosse-Kunstleve (rwgk) Date: 2002-01-11 17:17
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
msg8705 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2002-01-11 18:39
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.
msg8706 - (view) Author: Ralf W. Grosse-Kunstleve (rwgk) Date: 2002-03-25 23:08
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
msg8707 - (view) Author: Tim Peters (tim.peters) * (Python committer) Date: 2002-03-25 23:19
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.
msg8708 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2002-03-26 00:54
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.)
msg8709 - (view) Author: Michael Hudson (mwh) (Python committer) Date: 2002-03-26 12:59
Logged In: YES 
user_id=6656

It's in 221c2
History
Date User Action Args
2022-04-10 16:04:52adminsetgithub: 35903
2011-03-16 17:48:13brett.cannonsetnosy: mwh, gvanrossum, tim.peters, rwgk, brandon-rhodes
messages: - msg131148
2011-03-16 17:46:26brandon-rhodessetfiles: - test_copy2.patch
nosy: mwh, gvanrossum, tim.peters, rwgk, brandon-rhodes
2011-03-16 17:45:49brandon-rhodessetfiles: + test_copy2.patch

nosy: + brandon-rhodes
messages: + msg131148

keywords: + patch
2002-01-10 22:49:22rwgkcreate