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