Partial Function Application and implicit self problem

Gabriel Rossetti gabriel.rossetti at mydeskfriend.com
Thu Mar 27 09:40:30 CET 2008


Diez B. Roggisch wrote:
> Gabriel Rossetti schrieb:
>   
>> Hello,
>>
>> I am using Partial Function Application in a class and I've come up with 
>> a problem, when the method is called it tries to pass "self" to the 
>> curried/partial function, but this should be the first argument in 
>> reality, but since the function is curried, then the self gets passed as 
>> the second argument. Here is the code :
>>
>> def __registerService(self, atomic, service):
>>    def reg(service):
>>        # registers the service
>>        ...
>>          if(atomic):
>>        # Lock the service dict and register the service, then unlock it
>>        self.__mutex.lock(reg, service)
>>        self.__mutex.unlock()
>>    else:
>>        reg(service)
>>   registerServiceAtomic = partial(__registerService, True)
>> registerServiceNonAtomic = partial(__registerService, False)
>>
>> I should pass self when applying partial, but then I can't do that since 
>> self is not available there. Does anyone have any ideas?
>>     
>
> Use a bound-method instead. That has the self already bound to it. Like 
> this:
>
>
> class Foo:
>      def m(self, arg):
>          print arg
>
> f = Foo()
> partial(f.m, 10)
>
>
> Diez
>   

Ok, thanks, I moved the partial defs to __init__() and now it seams to 
work (I still have a but elsewhere, but this part no longer gives an error :


def __init__():
    self.registerServiceAtomic = partial(self.__registerService, True)
    self.registerServiceNonAtomic = partial(self.__registerService, False)

def __registerService(self, atomic, service):
    def reg(service):
        # registers the service
        ...
       
    if(atomic):
        # Lock the service dict and register the service, then unlock it
        self.__mutex.lock(reg, service)
        self.__mutex.unlock()
    else:
        reg(service)


Thanks,
Gabriel



More information about the Python-list mailing list