[python] hoe een functie doorgeven en aanroepen

Pagina: 1
Acties:
  • 1.210 views sinds 30-01-2008
  • Reageer

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Hoi

ik heb een classe:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class doh: 
    def setcallback(self, afunc):
        self.callfunc = afunc

    def onsomecallback(self, adata):
        if(self.callfunc):
               self.callfunc(adata)

    def wannagethere(self, adata):
        print adata

d = doh()
d.setcallback(d.wannagethere)
...
d.onsomecallback("mamamia wat is dit moeilijk")


wat ik dus wil is dat doh.wannagethere wordt aangeroepen met adata die 'mama'.

hier emuleer is die 'onsomecallback' maar in mijn programma wordt die ergens aangeroepen.
ik wil nu afhankelijk waar ik zit in mijn code mijn eigen handler daarvoor in de plaats zetten (nee ik kan de originele handler niet aanpassen). maar ik snap totaal niet hoe je in python zoiets als functions object moet doorgeven en nog belangrijker hoe ik die dan zelf kan aanroepen in de juiste scope.

aangezien de origenele callback iets is van:

someobject.sethandler(p.onsomecallback) weet ik dat het kan maar omdat ik niet weet hoe dat specifiek noemt levert google alleen maar 'C' callback etc op...

Tis iets simpel maar ik vind veel simpele dingen in python (zoals een for met i =0 :) of (een switch statement) nogal onsprekelijk moeilijk.. (zwijg me nog maar over de caps in True en False).

Ps de code hierboven werkt dus niet :)

  • truegrit
  • Registratie: Augustus 2004
  • Laatst online: 10-02 15:26
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> class X:
...     def setcallback(self, func):
...             self.func = func
...
...     def callback(self, data):
...             self.func(data)
...
...     def wannagetthere(self, data):
...             print data
...
...
>>> x = X()
>>> x
<__main__.X instance at 0x009D91E8>
>>> x.setcallback(x.wannagetthere)
>>> x.callback(5)
5


zoiets bedoel je toch? hier werkt het wel. gek :S

misschien komt het door die if(self.callfunc), dat die niet goed is, wat je nou niet zou zeggen

edit:
en een loop met getallen kan je als volgt doen
code:
1
2
3
4
5
6
7
for i in range(100):
    # iets

of 

for i in xrange(100):
    # nog iets


xrange gebruikt minder geheugen ofzo, omdat het alleen op demand een getal teruggeeft, waar range een list met getallen teruggeeft (denk ik)

en hier een switch alternatief
wel een beetje gek, maar het blijft python he ;)

[ Voor 35% gewijzigd door truegrit op 06-07-2006 20:05 ]

hallo


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

En om de opmerking van Soultaker hieronder te versterken: de code die je op hebt geschreven werkt wel. Tenminste, dit hieronder werkt bij mij ;).
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class X:
    def set(self, afunc):
        self.func = afunc
        
    def call(self, var):
        if (self.func):
            self.func(var)
        
    def foo(self, var):
        print var
        
x = X()
x.set(x.foo)
x.call("Werkt wel.")

[ Voor 240% gewijzigd door Confusion op 06-07-2006 21:12 ]

Wie trösten wir uns, die Mörder aller Mörder?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-02 21:33
Ik heb m'n uiterste best gedaan om je vraag te ontwarren in de hoofdletter-/paragraafloze brei die door moet gaan voor topic start, maar ik begrijp er geen hout van. Verder is je laatste opmerking ('de code hierboven werkt niet') raar, want de code die je geeft werkt wél en doet precies wat je beschrijft.

Ik stel dus voor dat je je probleem eens wat helderder probeert uit te leggen.

[ Voor 6% gewijzigd door Soultaker op 06-07-2006 21:08 ]


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Sorry voor het totale gebrek aan Caps e.d. [Soultaker]

Het is op een Series 60 mobile phone, en voor de een of andere reden word de callback dus niet uitgevoerd.

Ik begin te vermoeden dat het een threading issue is of dat het gebruik van appuifw (een module specifiek voor de mobile phone) problemen heeft. Aangezien het op 'normale' python wel werkt zoals jullie zeggen (ik test alles op de mobile want anders heeft het toch geen zin) ga ik het even testen met verschillende UI.

Sorry nogmaals voor de vraagstelling (en voor mijn steeds erger wordende nederlands :) )

Nog een bedankje aan truegrit ivm die 'switch' oplossing

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Ik weet niets van Python op mobiele telefoons, maar dit is basisfunctionaliteit en de scripts van truegrit en mij (die van mij demonstreert voornamelijk dat die 'if' geen probleem is) zouden op ieder platform moeten werken? Als die callback vanuit een andere thread oid. plaatsvind, dan kan dat natuurlijk een probleem zijn, maar dan kan je dat de volgende keer snel achterhalen door de callback ter debugging even direct achter de definitie te plaatsen, zoals wij deden.

Wie trösten wir uns, die Mörder aller Mörder?


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Op de PyS60 draait wel een oudere Python (IIRC iets van 2.1 of 2.2 ofzo), maar dat zou an sich geen probleem moeten zijn. Zou wel goed kunnen dat threads een probleem vormen, al heb ik daar zelf geen ervaring mee.

Rustacean


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-02 21:33
Als het aan de versie van Python ligt is het wellicht handig te vermelden om welke versie het dan gaat; in versie 2.2.3 werkt het in ieder geval ook gewoon goed. (En waarom ook niet? Er worden geen 'nieuwe' features gebruikt.)

Ik denk dus dat het probleem nog ergens anders ligt, zoals hobbit_be zelf ook suggereert.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
twas idd een series60 specifiek geval

de callback gebeurde in een thread die niet de UI thread (en het eerste in die callback was de title van de app aanpassen) was en vandaar dat ie niets deed (al zou die eigenlijk moeten crashen).

ik had het code voorbeeld vereenvoudigt om het simpeler te maken maar blijkbaar dan ook ineens het probleem 'opgelost'.

de versie was 1.3.1 van de series 60 python (laatse versie). op welke dat ie gebaseerd is - geen idee, ben nog maar een weekje aan't pythonnen gewoon omdat het allemaal toch wat sneller gaat (om te devven) dan java J2ME.
Pagina: 1