La variabile Python assegnata da un modulo esterno è accessibile per la stampa ma non per l'assegnazione nel modulo di destinazione

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ho due file, uno è nella webroot e un altro è un bootstrap situato una cartella sopra la radice web (questa è la programmazione CGI a proposito).

Il file indice nella radice Web importa il bootstrap e gli assegna una variabile, quindi chiama una funzione per inizializzare l'applicazione. Tutto fino a qui funziona come previsto.

Ora, nel file bootstrap posso stampare la variabile, ma quando provo ad assegnare un valore alla variabile viene generato un errore. Se porti via la dichiarazione di incarico non vengono generati errori.

Sono davvero curioso di sapere come funziona lo scoping in questa situazione. Posso stampare la variabile, ma non posso assegnarla. Questo è su 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)

Grazie.

Modifica: il messaggio di errore

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>
È stato utile?

Soluzione

prova questo:


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

Senza 'VAR globale' Python desidera utilizzare la variabile locale VAR e darti "UnboundLocalError: variabile locale" VAR "a cui si fa riferimento prima dell'assegnazione "

Altri suggerimenti

Non dichiararlo globale, passalo invece e restituiscilo se devi avere un nuovo valore, come questo:

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

----

import bootstrap
b = bootstrap.initialize('testVar')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top