[Python-es] namespaces y variables globales

jordi torrents jtorrents en milnou.net
Mie Nov 3 16:38:16 CET 2010


Hola lista,

Tengo una duda sobre cómo funcionan los namespaces y las variables
globales en python. El problema me ha surgido usando el módulo
optparse, necesito passarle a un script un valor en la línea de
comandos y que ese valor sea utilizado en funciones internas que son
llamadas desde la función "main". El caso es que, si es possible, me
gustaria no tener que pasar explícitamente este valor a las funciones
que lo utilizarán. Sin entender del todo los namespaces en python (no
soy programador), me parece que si asigno el valor a una variable que
resida en el namespace global, todas las funciones que son llamadas
desde main podrán encontrarlo sin problemas. Pero no se cómo hacerlo.

Abajo cópio un trozo de código que muestra el problema. Tal cómo está
produce un error porqué la función "test_func" no encuentra la
variable a. Haciendo un poco de prueba y error he visto que si declaro
la variable "a" cómo global justo antes de llamar a "test_func" (ie
descomentar la línia 22 del ejemplo de abajo) el script funciona pero
produce el warning: "./test.py:27: SyntaxWarning: name 'a' is assigned
to before global declaration". He leido un poco sobre la declaración
"global" y tengo claro que no se puede usar cómo yo pretendo (si he
entendido bién es para modificar el valor de una variable global en el
contexto local de una función).

En resumen, temo que hay algo muy obvio que se me escapa o quizá lo
que estoy intentando hacer es una tonteria y lo que hay que hacer es
pasar explícitamente el variable "a" a las funciones que la tengan que
utilizar.

Gracias i Salut!

--------------test.py-------------------
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from optparse import OptionParser

def test_func():
    print a + 2

def main():
    parser = OptionParser()
    parser.add_option('-t','--run_test', action='store_true', dest='run', \
        help='Run test',default=False)
    parser.add_option('-n', '--number', help='Number', dest='number', \
        action='store', type='int', default=None)
    options, args = parser.parse_args()

    if not options.number:
        a = 1
    else:
        a = options.number

    if options.run:
        #global a
        test_func()

if __name__ == '__main__':
    main()
-------------------------------------------------


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