La variable Python asignada por un módulo externo es accesible para imprimir pero no para asignación en el módulo objetivo

StackOverflow https://stackoverflow.com/questions/605399

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo dos archivos, uno está en webroot y otro es un bootstrap ubicado en una carpeta sobre la raíz web (esto es, por cierto, la programación CGI).

El archivo de índice en la raíz web importa la rutina de arranque y le asigna una variable, luego llama a una función para inicializar la aplicación. Todo hasta aquí funciona como se esperaba.

Ahora, en el archivo de arranque, puedo imprimir la variable, pero cuando intento asignar un valor a la variable, se produce un error. Si quitas la declaración de asignación, no se arrojan errores.

Tengo mucha curiosidad acerca de cómo funciona el alcance en esta situación. Puedo imprimir la variable, pero no puedo asignarla. Esto está en Python 3.

index.py

# Import modules
import sys
import cgitb;

# Enable error reporting
cgitb.enable()
#cgitb.enable(display=0, logdir="/tmp")

# Add the application root to the include path
sys.path.append('path')

# Include the bootstrap
import bootstrap

bootstrap.VAR = 'testVar'

bootstrap.initialize()

bootstrap.py

def initialize():
    print('Content-type: text/html\n\n')
    print(VAR)
    VAR = 'h'
    print(VAR)

Gracias.

Editar: El mensaje de error

UnboundLocalError: local variable 'VAR' referenced before assignment 
      args = ("local variable 'VAR' referenced before assignment",) 
      with_traceback = <built-in method with_traceback of UnboundLocalError object at 0x00C6ACC0>
¿Fue útil?

Solución

prueba esto:


def initialize():
    global VAR
    print('Content-type: text/html\n\n')
    print(VAR)
    VAR = 'h'
    print(VAR)

Sin el 'VAR global', python quiere usar el VAR de la variable local y le da " UnboundLocalError: variable local 'VAR' referenciada antes de la asignación "

Otros consejos

No lo declare global, páselo y devuélvalo si necesita tener un nuevo valor, como este:

def initialize(a):
    print('Content-type: text/html\n\n')
    print a
    return 'h'

----

import bootstrap
b = bootstrap.initialize('testVar')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top