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).


-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to