2009-01-30 21 views
11

Soy nuevo en Python, así que disculpe la que probablemente sea una pregunta bastante tonta.Confusión sobre las variables globales en python

Básicamente, tengo una sola variable global, llamada _debug, que se utiliza para determinar si el script debe generar o no información de depuración. Mi problema es que no puedo configurarlo en un script de Python diferente al que lo usa.

Tengo dos guiones:

one.py: 
------- 

def my_function(): 
    if _debug: 
    print "debugging!" 


two.py: 
------- 

from one import * 
_debug = False 

my_function() 

Correr two.py genera un error:

NameError: global name '_debug' is not defined 

Puede alguien decirme lo que estoy haciendo mal?

Respuesta

16

Existen más problemas que solo el subrayado inicial me temo.

Cuando llame al my_function(), aún no tendrá su variable debug en su espacio de nombres, a menos que la importe de two.py.

Por supuesto, hacer eso significa que terminará con dependencias cíclicas (one.py -> two.py -> one.py), y obtendrá NameError s a menos que refactorice donde se importan y se declaran varias cosas.

Una solución sería la creación de un tercer módulo simple que define 'constantes' de este tipo, que puede ser importado en forma segura desde cualquier lugar, por ejemplo:

constants.py 
------------ 
debug = True 

one.py 
------ 
from constants import debug 
#... 

two.py 
------ 
from constants import debug 
#... 

Sin embargo, yo recomendaría simplemente utilizando el construido en logging módulo para esto, ¿por qué no? Es fácil de configurar, más fácil de usar, confiable, flexible y extensible.

+0

Sí, el módulo de registro es el camino a seguir aquí. –

5

nombres que comienzan con un carácter de subrayado no se importan con

from one import * 
+1

Y es porque quieren decir "esto es interno, no lo toques, o hazlo bajo tu propio riesgo". –

+0

Estoy realmente sorprendido de que una respuesta completamente incorrecta haya sido aceptada y votada tan altamente. –

+0

Bueno, no es completamente incorrecto; kgiannakakis tiene razón sobre los nombres que comienzan con guiones bajos que no se importan. Sin embargo, tienes razón en que esto todavía no es el motivo por el que su código de ejemplo no funciona. Tu respuesta es mucho mejor –

4

También puede utilizar la variable __debug__ para la depuración. Es cierto si el intérprete no se inició con la opción -O. La declaración de afirmación también puede ser útil.

1

Una explicación un poco más: el espacio de nombres de la función my_function está siempre en el módulo one. Esto significa que cuando el nombre _debug no se encuentra en my_function, se ve en one, no en el espacio de nombre desde el que se llama a la función. La respuesta de Alabaster proporciona una buena solución.