Can't define __call__ within __init__?

Neal Becker ndbecker2 at gmail.com
Wed Mar 10 08:41:28 EST 2010


Simon Brunning wrote:

> On 10 March 2010 13:12, Neal Becker <ndbecker2 at gmail.com> wrote:
>> Want to switch __call__ behavior.  Why doesn't this work?  What is the
>> correct way to write this?
>>
>> class X (object):
>> def __init__(self, i):
>> if i == 0:
>> def __call__ (self):
>> return 0
>> else:
>> def __call_ (self):
>> return 1
>>
>>
>> x = X(0)
>>
>> x()
>> TypeError: 'X' object is not callable
> 
> __call__ is in the __init__ method's local namespace - you need to
> bind it to the class's namespace instead:
> 
>         X.__call__ = __call__
> 
> But this probably isn't what you want either, since all instances of X
> will share the same method.
> 
> What are you trying to do? In your simple example, you'd be much
> better off with a single __call__ method. But you knew that.
> 

Sorry, a bit early in the morning.  This works:
class X (object):
    def __init__(self, i):
        if i == 0:
            def F (self):
                return 0
        else:
            def F (self):
                return 1
        self.F = F
        
    def __call__ (self):
        return self.F (self)
   

Not sure if there is a more elegant (or compact) way to write this.
Could __call__ be defined directly within __init__?

What I'm trying to do is make a callable whose behavior is switched based on 
some criteria that will be fixed for all calls.  In my example, this will 
ultimately be determined by the setting of a command line switch.




More information about the Python-list mailing list