Ho una classe che specifica un insieme di funzioni di callback (qui indicato come cb1
e cb2
). Tengo una mappa di questi che voglio chiamare dopo qualche evento.Riferimento Python al callback nel dizionario
class Foo:
cb1 = None
cb2 = None
def test(self, input):
for (name, callback) in map:
if name == input:
if callback: callback()
...
map = {'one':cb1, 'two':cb2}
def mycallback():
print "mycallback()"
f = Foo()
f.cb1 = mycallback # Register our callback
f.test('one') # Nothing happens
Riesci a individuare il problema?
Cosa accade, è che quando la classe viene inizializzato, i valori di cb1
e cb2
(che sono entrambi None
) vengono copiati nella mappa. Quindi, anche dopo che un utente "registra" il callback (assegnando a cb1
), il valore nella mappa è ancora None
e non viene richiamato nulla.
Poiché in Python non esiste qualcosa come "di riferimento", come posso rimediare?
Nitpick: tutto è passato 'per riferimento' in Python. Ma è per riferimento, non per * nome *: se si riassembla il nome in un altro oggetto, questo non aggiorna altri riferimenti a qualunque nome puntasse. –