Partial Function Application and implicit self problem

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Thu Mar 27 05:22:13 EDT 2008


Gabriel Rossetti a écrit :
> 
> Gabriel Rossetti wrote:
>> 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?
>>
>> Thanks,
>> Gabriel
>>   
> I also tried this :
> 
> def __registerService(atomic, self, 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)
> 
> thinking that the self will be passed as the first argument of the 
> registerService* calls and thus the second argument to the 
> curried/partial method, but it doesn't work either, I get :
> 
> Traceback (most recent call last):
>  File "/home/xxx/Documents/Code/Python/test/test_serv.py", line 245, in 
> test_registeration
>    self.f.registerServiceAtomic(self.serv)
> exceptions.TypeError: __registerService() takes exactly 3 arguments (2 
> given)
> 
> I don't get it...

Looks like functools.partial doesn't implement the protocol descriptor 
to behave like an ordinary function. I suppose there's some good reason 
for this, but anyway you'll have to either extend partial to add the 
appropriate descriptor support, or provide self by yourself (like Diez 
suggested).





More information about the Python-list mailing list