[Python-es] scope de variables

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Vie Jun 18 16:20:55 CEST 2010


El día 18 de junio de 2010 09:43, Oswaldo Hernández
<listas en soft-com.es> escribió:
> Dr. Bobus escribió:
>>
>> El Fri, 18 Jun 2010 12:27:11 +0000 (GMT)
>> Luis Garcia Merino <lgmerino en yahoo.com> dijo:
>>
>>
>>> Buenas,
>>> una pregunta que igual es un poco tonta, pero no acabo de comprender bien
>>> porque utilizas eval... ¿por qué no le pasas a la función imagen
>>> directamente los arrays en vez de los nombres? O mejor, los nombres y los
>>> arrays... Quizás algo como:
>>>
>>> datos = { 'cmasa': cmasa, 'cmovi':cmovi, 'cfago':cfago...}
>>>  imagen(ciclo,datos,'Células')
>>
>>
>> Hola:
>>
>> La verdad es que quizá me complico la vida, pero el hecho es que las
>> matrices son muchas más y de antemano no se cuales se van a pasar a la
>> función (sólo se que 6 ni una más ni una menos). Es por ello que en realidad
>> llamo a la función pasándole una lista de nombres que previamente se ha
>> generado en otro lado. Generar un diccionario en lugar de una lista no me
>> pareció mejor. Además (y esto lo digo desde la ignorancia) pensé que me
>> daría problemas con la memoria. De hecho en otras partes del programa estoy
>> teniendo errores de memoria que aún no he conseguido identificar bien.
>>
>> Pero la pregunta sigue en el aire... ;) ¿debería funcionar el código que
>> he puesto?

a priori debiera funcionar, pero creo que eval no está siendo lo
suficientemente inteligente o nosotros no somos lo suficientemente
inteligentes para ver la especificación de eval ;)

>>
>
> La funcion imagen() no ve las variables que has definido fuera de ella.

Eso lamentablemente es un error bastante común en los programadores
(yo igual antes pensaba eso).  La función ve TODO  lo que está
definida en su scope al momento de nacer = Scope léxico o Scope
estático (también lo llaman).

>
> Si quieres utilizar strings para nombrar los elementos creo que deberias
> utilizar un diccionario, algo como:
>
> dvars = {}
> dvars['cmasa'] = ...
> dvars['cmovi'] = ...
>
> le agregas el diccionario en los parametros de la funcion imagen y alli
>
> for i, label in enumerate(graficos):
>        array = dvars[label]

más sencillo que eso debiera referirse al nombre de la variable y listo!

    def imagen(ciclo,graficos,texto,tipo=' '):
        "Genera un fichero con un gráfico de 6 matrices en un ciclo dado"
	print cmasa
	print cmovi
	print cedad
	print cemax
	print cfoto
	print cfago
	print cmasd


pero claro! tu quieres enviarle un string y que funcione
inmediatamente (es una buena idea) pero eval no permite esto :-S, hice
lo siguiente:

    def imagen(ciclo,graficos,texto,tipo=' '):
        "Genera un fichero con un gráfico de 6 matrices en un ciclo dado"
        #hago cosas
        #hago más cosas
	print cmasa
	print cmovi
	print cedad
	print cemax
	print cfoto
	print cfago
	print cmasd
        for i, label in enumerate(graficos):
            print 'hacemos grafico de %s' % label
            array = eval(label,globals,locals)

y adivina qué?, funciona :O....me voy a clases luego en la tarde
seguiré viendo este problemita (se ve interesante)...o bueno si alguno
de los gurues de la lista lo contesta antes, mejor para ti
;)...saludos!

>
>
> Saludos,
>
> --
> Oswaldo Hernández
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



-- 
Milton Inostroza Aguilera


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