closures

Carles Pina i Estany carles en pina.cat
Lun Jul 23 12:49:11 CEST 2007


Hola,

On Jul/23/2007, Chema Cortes wrote:
> El 22/07/07, Carles Pina i Estany <carles en pina.cat> escribió:
> 
> >Estoy intentando entender las closures. En la Wikipedia 
> >(http://en.wikipedia.org/wiki/Closure_(computer_science) (al principio) 
> >puedo ver de
> >qué se trata. Entiendo que es que el comportamiento de una función está
> >determinado, en parte, por el comportamiento de datos/código externo de
> >esta función. Básicamente, que puede acceder fuera de la función.
> 
> Umm! Dicho así parece otra cosa de lo que es. Una función nunca
> debería acceder "fuera" de sus dominios bajo ninguna circunstancia.

ok, así el tema de closura es válido, útil para definir el entorno que
la función puede acceder (ya que al final accede fuera de su entorno, de
forma limitada)

> Normalmente, las funciones se definen en el mismo entorno donde se
> ejecutan; pero hay ocasiones en las que no ocurre así, como en el caso
> de las funciones anidadas donde una función se define dentro del
> entorno local de otra. En este caso, la función anidada se ejecutará
> en el entorno donde se ha definido, fuera de los ojos del resto del
> programa. Ésto es lo que se conoce por "clausura".

ok, me lo habia parecido entender. Gracias

> Así, podemos definir "clausura" como el entorno donde se define una
> función y que sólo va a ser "visible" por esta función. Y por
> "entorno", en python, debería entenderse el conjunto de objetos de los
> que contamos con alguna "referencia" a ellos (en otros lenguajes se
> hablan de otras cosas como stacks, heaps, etc).

"cojonudo"!

> >Leo aquí (ojo, del año 2003):
> >http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/67618
> >Que python no tiene closures completas como Ruby por este motivo:
> >-----
> >But in Python, the inner function only has access to the _object_, not
> >to the original variable which refers to the object
> >-----
> >
> >Así, en Python hay closures "parciales"? He entendido bien que las
> >clsorues son algo tan simple como que una función pueda acceder a datos
> >de fuera de la función, de quien llama la función?
> 
> ¡ÉSO ES PECADO!

sí, sé que es pecado y que rompe totalmente la estructura del programa
:-) No lo escribí porqué hablaba de closures y no de diseño :-)

> Una versión "forzada", que viene a emular lo que se entendería por
> clausura "completa":
> 
> def make_counter(start):
> 	def counter(inc):
> 		global start
> 		start+=inc
> 		return start
>        counter.func_globals.clear()
> 	counter.func_globals.update(locals())
> 	return counter
> 
> c=make_counter(0)
> print c(3)
> print c(2)

vale, claro al 100%
Aunque es un concepto que no me gusta mucho. Me imagino que algun dia
veré un caso que me simplificará mucho la vida :-)

Parece que con generadores, paso de argumentos, etc. casi siempre puedo
hacer lo mismo...

1000 gracias. Estuve bastante rato los últimos dias para averiguar esto
y no me quedaba al 100% claro.

-- 
Carles Pina i Estany		GPG id: 0x8CBDAE64
	http://pinux.info	Manresa - Barcelona




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