Re: [Python-es] namespaces y variables globales

2010-11-04 Por tema jordi torrents
Hola,

2010/11/3 Oswaldo Hernández:

 Has probado a insertar la variable directamente en el diccionario globals?:

 if not options.number:
    globals()[a] = 1
 else:
    globals()[a] = options.number

Gracias a todos por vuestros comentarios y sugerencias. Finalmente he
optado por la solución que propone Oswaldo. No sé si esta solución es
muy ortodoxa, pero me funciona perfectamente.

Gracias de nuevo i Salut!
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] namespaces y variables globales

2010-11-04 Por tema Ramiro
2010/11/3 Oswaldo Hernández:

 Has probado a insertar la variable directamente en el diccionario globals?:

 if not options.number:
    globals()[a] = 1
 else:
    globals()[a] = options.number

Gracias a todos por vuestros comentarios y sugerencias. Finalmente he
optado por la solución que propone Oswaldo. No sé si esta solución es
muy ortodoxa, pero me funciona perfectamente.


El problema que le veo es que queda muy escondida, si es una variable global 
tendría que quedar bien en claro eso  por si otra persona, o vos mismo dentro 
de un tiempo, lee el programa.

Yo lo haría al modo de Alvaro Manrique como te dijo en un mensaje. Y si tendría 
que usar esa variable en varios módulos distintos (varios archivos .py), 
crearía un módulo con todas las variables globales y luego para leerlas o 
asignarles valores me referiría a esas variables con su nombre de módulo y todo.

Algo así:

archivo - glob.py

--

var1 = 0

var2 = 23

  

def ff():

    print dd

--

archivo  -  globales.py
---
import glob

def mm():
    print glob.var2
    glob.var2 = 999
    print glob.var2
    glob.ff()

mm()
--

saludos



  ___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] namespaces y variables globales

2010-11-04 Por tema jordi torrents
Hola Ramiro,

2010/11/4 Ramiro:
 El problema que le veo es que queda muy escondida, si es una variable global 
 tendría que quedar bien en claro eso  por si otra persona, o vos mismo 
 dentro de un tiempo, lee el programa.

 Yo lo haría al modo de Alvaro Manrique como te dijo en un mensaje. Y si 
 tendría que usar esa variable en varios módulos distintos (varios archivos 
 .py), crearía un módulo con todas las variables globales y luego para leerlas 
 o asignarles valores me referiría a esas variables con su nombre de módulo y 
 todo.

Es verdad que la utilización directa de globals() es bastante
críptica pero creo que lo que propones no funcionaría en mi caso. Yo
necessito crear una instáncia de una classe con un valor (número de
cpus a utilizar) que le passo al programa desde la línia de comandos.
Esta instáncia (de la calse Server de parallelpython) debe ser
accesible para bastantes funciones del programa. Cómo tengo que
pasarle ese valor desde la línea de comandos (utilizo optparse) sólo
puedo leer el valor desde la función main, y si instancio la classe
Server en la función main, ésta se queda en el contexto local de la
función y no es accessible para las otras funciones del programa que
son las que utilizan la paralelización para hacer parte de los
cálculos.

Cabe decir que este apaño sólo lo necesito para hacer unos tests de
escalabilidad de los cálculos en el clúster. Una vez hechos los tests,
el programa que ejecuta los cálculos ya no necessitará que le pase via
línea de comandos el número de cpus a utilizar.

Otra opción que se me ocurre para hacer los tests es no pasar el
número de cpus via línea de comandos sinó editar cada vez el script
antes de ejecutarlo y poner a mano el número de cpus en la instancia
Server de parallel python. Pero no me gusta mucho la perspectiva, y la
opción que propone Oswaldo me funciona bien. O sea que haré los tests
así y pondré un comentario bien visible en la función main explicando
el uso directo de globals().

Gracias i Salut!
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] namespaces y variables globales

2010-11-04 Por tema Chema Cortes
El día 4 de noviembre de 2010 20:04, jordi torrents
jtorre...@milnou.net escribió:

 Es verdad que la utilización directa de globals() es bastante
 críptica pero creo que lo que propones no funcionaría en mi caso.

El uso de globals() de esta manera tiene sentido cuando no conoces de
antemano el nombre de la variable global. En tu caso creo que no es
así, por lo que igual te daría haber puesto:

a = 1 is not options.number else options.number

Las funciones deberían declarar esta variable como global, aunque
está implícito si no modificas su valor.


Tal como propones, una solución sería crear la instancia en programa
principal e importarla desde las funciones. Para ello puedes
aprovechar que el módulo principal siempre se llama __main__

from __main__ import job_server


Otra opción sería centralizar las llamadas a las funciones en un único
lugar y aplicar el método set_ncpus sobre cada instancia, pero supongo
que ya lo habrás descartado, pero es una buena forma de tener
documentado cómo has hecho las pruebas por si lo necesitas revisar más
adelante.
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] namespaces y variables globales

2010-11-04 Por tema Alvaro Manrique
Apoyo la idea de crear un modulo para las variables globales, de hecho
para mi concepto es una buena practica de programacion.



El 04/11/10, Ramiro rmrsn...@yahoo.com.ar escribió:
2010/11/3 Oswaldo Hernández:

 Has probado a insertar la variable directamente en el diccionario
 globals?:

 if not options.number:
    globals()[a] = 1
 else:
    globals()[a] = options.number

Gracias a todos por vuestros comentarios y sugerencias. Finalmente he
optado por la solución que propone Oswaldo. No sé si esta solución es
muy ortodoxa, pero me funciona perfectamente.


 El problema que le veo es que queda muy escondida, si es una variable global
 tendría que quedar bien en claro eso  por si otra persona, o vos mismo
 dentro de un tiempo, lee el programa.

 Yo lo haría al modo de Alvaro Manrique como te dijo en un mensaje. Y si
 tendría que usar esa variable en varios módulos distintos (varios archivos
 .py), crearía un módulo con todas las variables globales y luego para
 leerlas o asignarles valores me referiría a esas variables con su nombre de
 módulo y todo.

 Algo así:

 archivo - glob.py

 --

 var1 = 0

 var2 = 23



 def ff():

     print dd

 --

 archivo  -  globales.py
 ---
 import glob

 def mm():
     print glob.var2
     glob.var2 = 999
     print glob.var2
     glob.ff()

 mm()
 --

 saludos





-- 
Enviado desde mi dispositivo móvil
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] namespaces y variables globales

2010-11-04 Por tema Alvaro Manrique
En un programa que hice para transferencia de data entre servidores
mysql, yo utilizo una misma instancia de la clase que cree para el
manejo de la coneccion, querys, etc, en muchas funciones, esto lo hice
tal cual lo coloque en el ejemplo, cree mi variable al inicio del
modulo y la funcion que va a crear la instancia, que en tu caso es
main(), la declaro como global

  global variable

Con esto logre usar la instancia en todo el programa sin tener que
pasarla de funcion a funcion y consumir mas memoria.



El 04/11/10, Alvaro Manrique sanreikaj.fo...@gmail.com escribió:
 Apoyo la idea de crear un modulo para las variables globales, de hecho
 para mi concepto es una buena practica de programacion.



 El 04/11/10, Ramiro rmrsn...@yahoo.com.ar escribió:
2010/11/3 Oswaldo Hernández:

 Has probado a insertar la variable directamente en el diccionario
 globals?:

 if not options.number:
    globals()[a] = 1
 else:
    globals()[a] = options.number

Gracias a todos por vuestros comentarios y sugerencias. Finalmente he
optado por la solución que propone Oswaldo. No sé si esta solución es
muy ortodoxa, pero me funciona perfectamente.


 El problema que le veo es que queda muy escondida, si es una variable
 global
 tendría que quedar bien en claro eso  por si otra persona, o vos mismo
 dentro de un tiempo, lee el programa.

 Yo lo haría al modo de Alvaro Manrique como te dijo en un mensaje. Y si
 tendría que usar esa variable en varios módulos distintos (varios
 archivos
 .py), crearía un módulo con todas las variables globales y luego para
 leerlas o asignarles valores me referiría a esas variables con su nombre
 de
 módulo y todo.

 Algo así:

 archivo - glob.py

 --

 var1 = 0

 var2 = 23



 def ff():

     print dd

 --

 archivo  -  globales.py
 ---
 import glob

 def mm():
     print glob.var2
     glob.var2 = 999
     print glob.var2
     glob.ff()

 mm()
 --

 saludos





 --
 Enviado desde mi dispositivo móvil


-- 
Enviado desde mi dispositivo móvil
___
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/