Hi!

On Thu, Apr 06, 2017 at 12:24:47PM +1000, Steven D'Aprano <st...@pearwood.info> 
wrote:
> On Thu, Apr 06, 2017 at 02:30:06AM +0200, Oleg Broytman wrote:
> 
> > I spent few days hunting
> > for a subtle bug caused by absent of unbound methods.
> >    Painful. :-(
> 
> I'm curious about this. What do you mean? Python 3 has unbound methods, 
> they're just the original, unwrapped function:
> 
> py> class K:
> ...     def method(self, arg):
> ...             pass
> ...
> py> K.method
> <function K.method at 0xb7cbd6a4>

   I know.

> The only(?) functional difference between unbound methods in Python 2 
> versus 3 is that in Python 2 they automatically do a type-check that 
> `self` is an instance of the class.

   The check was involved, yes. The bug I was hunting manifested itself
in PY3 with exceptions hinting that instead of `self` I've passed
`self.__class__`. In PY2 everything worked fine.
   I found the problem in dynamically created methods. Someone
implemented them this way:

if PY2:
    def createMethod(func, cls):
        return types.MethodType(func, None, cls)
else:
    def createMethod(func, cls):
        return types.MethodType(func, None)

   Hard to spot at the first glance what was the problem. Finally I grok
the problem and fixed the implementation for PY3 to

    def createMethod(func, cls):
        return func

> -- 
> Steve

Oleg.
-- 
     Oleg Broytman            http://phdru.name/            p...@phdru.name
           Programmers don't die, they just GOSUB without RETURN.
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to