pickle and instancemethod objects

Steven Bethard steven.bethard at gmail.com
Wed Sep 13 13:06:03 EDT 2006


Martin v. Löwis wrote:
> Steven Bethard schrieb:
>> Does this approach seem sound?  Am I going to run into some weird
>> problems doing it this way?
> 
> It's good, but I think rebuilding the object through
> new.instancemethod should be even better.
> 
> py> class A:
> ...   def f(self):print "A"
> ...
> py> class B(A):
> ...   def f(self):print "B"
> ...
> py> b=B()
> py> b.f
> <bound method B.f of <__main__.B instance at 0xa7d728cc>>
> py> x = new.instancemethod(A.__dict__['f'], b, A)
> py> x
> <bound method A.f of <__main__.B instance at 0xa7d728cc>>
> py> x()
> A
> py> b.f()
> B
> py> x.im_func.__name__,x.im_class,x.im_self
> ('f', <class __main__.A at 0xa7d7002c>, <__main__.B instance at 0xa7d728cc>)
> 
> On unpickling x, you'ld get x.(B.f), not x.(A.f) with your
> approach.
> 
> Not sure it matters much.

Probably doesn't matter for my particular use, but it certainly wouldn't 
hurt to do it the careful way.  Thanks.

Is new.instancemethod basically equivalent to calling __get__?  That is, 
would the following two unpickle_instancemethod functions do the same thing?

     def unpickle_instancemethod(func_name, cls, obj):
         return cls.__dict__[func_name].__get__(obj, cls)

     def unpickle_instancemethod(func_name, cls, obj):
         return new.instancemethod(cls.__dict__[func_name], obj, cls)

Thanks again,

STeVe



More information about the Python-list mailing list