[Python-es] RE: [Python-es] RE: [Python-es] ¿Cierres en Python?

Hernan Martinez Foffani hernan en orgmf.com.ar
Mie Ago 7 16:39:57 CEST 2002


> > ¿tiene que ser nuevoMensaje() un metodo de la clase?
>
>    No necesariamente, pero tiene que tener alguna forma de saber
> cuál es el objeto que registró la función de recepción de mensaje.
> La única solución que se me ocurre para que una función tenga
> «consciencia» de un valor es que esa función sea un método....
> o usar un cierre.

el problema de pasarle un metodo es que perdes la referencia al
objeto porque precisamente estas pasando el metodo y no el objeto.
pero esto ya lo sabes :-)
python no tiene cierres. quizás te sirva atributos de funciones:

def f(msg):
  print ">", msg, f.objeto

f.objeto = [1,2,3]



> > ¿cual es la interfaz de jabber.setMessageHandler()?
>
>    La definición completa es
>
> ------------------------- 8< -------------------------
>        def setMessageHandler(self, func, type='default'):
>         """Sets a the callback func for recieving messages
>            Mulitple callback functions can be set which are
>            called in succession. A type attribute can also be
>            optionally passed so the callback is only called when a
>            message of this type is recieved.
>            """

en ningun lado te dice de los 2 parametros (con y msg). supongo
que lo habrás sacado del codigo u otro lado.


>    Algo parecido se me había ocurrido, pero me hice un lío y no di con la
> solución. Probando algo similar a lo que propones, da otro error en la
> llamada, porque al objeto le falta el atributo «func_code».
> Supongo que debe ser algo interno de las funciones.

mmm... podría ser que la implementación está chequeando que sea una funcion
real, y no un callable.  si el callback fuera invocado con
  apply(objeto_callback, [parametro_con, parametro_msg])
no tendrías mayores problemas.  sospecho que está chequeando de mas.

> PD: Por cierto, ¿no se supone que añadieron cierres a Python
> 2.2? Yo uso 2.1, es sólo por curiosidad.

lo que se agregaron fueron los "nested scopes".  que es una condicion
necesaria (pero no suficiente) para tener cierres en python.

-Hernan





Más información sobre la lista de distribución Python-es