callback + __call__ + TypeError: unbound method; on non method

Volker Apelt blackhole at notformail.invalid.de
Tue Sep 24 11:46:23 EDT 2002


Alex Martelli <aleax at aleax.it> writes:

> Volker Apelt wrote:
> 
> > But I can't remove the .__call__ method from my
> > Callback class. The method is essential for
> 
> The problem is not with method __call__, as it gets called
> with an instance.  Rather, it's right here:
> 
> > class Callback:
> >     """
> >     """
> >     _default_Func = call_me # class wide default callback function
> >     
> >     def __init__(self):
> >         """ """
> >         self._m_func = Callback._default_Func
> 
> Here, self._m_func is NOT a function -- it's an unbound method,
> thus it's not callable unless the first argument is an instance
> of the class (or any subclass thereof).
> 
> When you fetch from a class an attribute that is a Python coded
> function object, what you get is an unbound method object.  This
> behavior is intrinsic to Python's OO mechanisms.
> 
> Remedy: have Callback._default_Func be just about ANY callable
> except a Python-coded function object:-).  In Python 2.2, the
> built-in staticmethod is made just for the purpose:
> 
> class Callback:
>      """
>      """
>      _default_Func = staticmethod(call_me) # class wide default callback 
> 
> and the rest can stay unchanged (haven't examined it in detail, but
> this is the surely-buggy spot in your code and explains the traceback
> that you report).

Let me rephrase what you stated above.  Callback._default_Func is 
*always* a method. Thats the way python understands this code. 
So Python below v2.2 can not store a function reference in a 
class static variable (c++ speak) and use it later as for function
call. 

So, I have to upgrade to v2.2 and write:

class Callback:
    """
    """
    _default_Func = staticmethod(call_me)# class wide default callback function
   
    def __init__(self):
         """ """
         self._m_func = staticmethod(Callback._default_Func)

    def __call__(self):
         self._m_func() # << this will call call_me()  ???


Thank you Alex,


Volker
-- 
Volker Apelt                   



More information about the Python-list mailing list