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