Re: [Python-es] namespaces y variables globales
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/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
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
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
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
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/