Tengo una clase que especifica un conjunto de funciones de devolución de llamada (que se muestran aquí como cb1
y cb2
). Guardo un mapa de estos a los que quiero llamar después de algún evento.Referencia de Python a la devolución de llamada en el diccionario
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
¿Puedes ver el problema?
¿Qué ocurre, es que cuando se inicializa la clase, los valores de cb1
y cb2
(que son a la vez None
) se copian en el mapa. Entonces, incluso después de que un usuario 'registra' la devolución de llamada (asignando a cb1
), el valor en el mapa sigue siendo None
y no se llama a nada.
Dado que en Python no existe el término "por referencia", ¿cómo lo soluciono?
nitpick: todo lo que se pasa 'por referencia' en Python. Pero es por referencia, no por * nombre *: si vuelve a vincular el nombre a otro objeto, eso no actualiza otras referencias a lo que apuntaba el nombre. –