Import variables.
Chema Cortes
py en ch3m4.org
Dom Ene 20 12:16:35 CET 2008
El Saturday 19 January 2008 14:26:58 José Miguel Sánchez Alés escribió:
> Tengo el siguiente problema que no sé como resolver:
>
> #v+
> #!/usr/bin/python
> #
> # prueba.py
> #
>
> prec=2
>
> class Tonteria(object):
> def muestraPrec(self,dec=None):
> if dec is None:
> dec=prec
> return dec
> #v-
>
>[...]
>
> Vale es lo que quiero. Sin embargo, si hago el import así:
>
> >>> from prueba import *
> >>> prec
>
> 2
>
> >>> a=Tonteria()
> >>> a.muestraPrec()
>
> 2
>
> >>> prec=10
> >>> a.muestraPrec()
>
> 2
>
> Puedo acceder a prec, cambiar su valor, pero el método de Tonteria que
> accedía a él no se entera del cambio. ¿A qué se debe? ¿Se le ocurre a
> alguien como solucionarlo (que no sea la solución trivial de meter prec
> en la clase Tonteria y acceder como Tonteria.prec)?
El funcionamiento de from..import * es recorrer los objetos del módulo para
crear referencias locales a ellos. Aunque tengan el mismo nombre, 'prec', son
dos variables: una la del módulo, "local" al módulo, y otra global que es la
que usas en la línea de comandos. Cuando asignas un nuevo valor a prec se
destruye la relación que tenía con el "valor" 'prec' del módulo.
Quiero resaltar lo de que se rompe la relación con el "valor" de prec porque,
como alguna vez hemos comentado, en python no se debería tomar
las "variables" como "almacenes de memoria" donde meter datos. Más bien, se
debe pensar que tenemos objetos en memoria a los que se accede a través
de "espacios de nombres". Estos objetos se crean y se destruyen por sus
propios medios, dejándonos la única certeza de que seguirán existiendo
siempre y cuando sean referenciados en algún sitio de la aplicación.
Lo que llamamos variables 'prec' no son más que referencias a objetos, y
cuando hablamos de "cambiar el valor" en realidad está cambiando una
referencia a un objeto por otro (en este caso, del entero 2 pasa a
referenciar al entero 10).
En cuanto a la forma de solucionarlo (y que no sea la "solución trivial" que
dices) pasa por importar el módulo conservando su espacio de nombres para así
poder acceder a sus variables:
>> import prueba
>> a=prueba.Tonteria()
>> a.muestraPrec()
2
>> prueba.prec=10
>> a.muestraPrec()
10
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es