From: Nathan Huesken on
Hi,

I have a class, where I want to store a callback function as a member
to access later:

class CallbackClass:
def setCallback(self,cb):
self.cb = cb

def callCallback(self, para):
self.cb(para)

Doing so, I get the error:
callbackFunc() takes exactly 1 parameter (2 given)

self is given as parameter this way, is it not? How can this be done?

Thanks!
Nathan
From: MRAB on
Nathan Huesken wrote:
> Hi,
>
> I have a class, where I want to store a callback function as a member
> to access later:
>
> class CallbackClass:
> def setCallback(self,cb):
> self.cb = cb
>
> def callCallback(self, para):
> self.cb(para)
>
> Doing so, I get the error:
> callbackFunc() takes exactly 1 parameter (2 given)
>
> self is given as parameter this way, is it not? How can this be done?
>
Could you provide a short program which we could run to reproduce the
problem?
From: Rhodri James on
On Wed, 07 Jul 2010 22:48:11 +0100, Nathan Huesken
<python(a)lonely-star.org> wrote:

> Hi,
>
> I have a class, where I want to store a callback function as a member
> to access later:
>
> class CallbackClass:
> def setCallback(self,cb):
> self.cb = cb
>
> def callCallback(self, para):
> self.cb(para)
>
> Doing so, I get the error:
> callbackFunc() takes exactly 1 parameter (2 given)
>
> self is given as parameter this way, is it not? How can this be done?

rhodri(a)gnudebst:~$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class CBClass:
.... def set_cb(self, cb):
.... self.cb = cb
.... def call_cb(self, para):
.... self.cb(para)
....
>>> def trivial(arg):
.... print arg
....
>>> c = CBClass()
>>> c.set_cb(trivial)
>>> c.call_cb("Hello, world")
Hello, world

Works for me. Which version of Python are you using?

--
Rhodri James *-* Wildebeeste Herder to the Masses
From: Emile van Sebille on
On 7/7/2010 2:48 PM Nathan Huesken said...
> class CallbackClass:
> def setCallback(self,cb):
> self.cb = cb
>
> def callCallback(self, para):
> self.cb(para)
>


You'll have to show how you're invoking this -- the following works for
me (ie, I don't get an error):

class CallbackClass:
def setCallback(self,cb):
self.cb = cb
def callCallback(self, para):
self.cb(para)


a = CallbackClass()


def test(param): return 2*param


a.setCallback(test)

a.callCallback(3)



Emile

From: Ian Kelly on
On Wed, Jul 7, 2010 at 3:48 PM, Nathan Huesken <python(a)lonely-star.org> wrote:
> Hi,
>
> I have a class, where I want to store a callback function as a member
> to access later:
>
> class CallbackClass:
>    def setCallback(self,cb):
>        self.cb = cb
>
>    def callCallback(self, para):
>        self.cb(para)
>
> Doing so, I get the error:
> callbackFunc() takes exactly 1 parameter (2 given)
>
> self is given as parameter this way, is it not? How can this be done?

No, self will not be passed as a parameter. A function is only
treated as a method when it is present in the class dict. If it is in
the instance dict as you have above, then it's just a normal function.
If you want it to receive self in this case, then you should have
your callCallback method pass it in explicitly.

HTH,
Ian