La variable Python affectée par un module extérieur est accessible pour l'impression mais pas pour l'affectation dans le module cible

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai deux fichiers, un dans la racine Web et un autre dans un répertoire situé au-dessus de la racine Web (c'est de la programmation CGI, au fait).

Le fichier d'index de la racine Web importe le bootstrap et lui attribue une variable, puis appelle une fonction pour initialiser l'application. Jusqu'ici, tout fonctionne comme prévu.

Maintenant, dans le fichier d'amorçage, je peux imprimer la variable, mais lorsque j'essaie d'attribuer une valeur à la variable, une erreur est générée. Si vous enlevez la déclaration d'affectation, aucune erreur n'est générée.

Je suis vraiment curieux de savoir comment fonctionne le cadrage dans cette situation. Je peux imprimer la variable, mais je ne peux pas y accéder. Ceci est sur 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)

Merci.

Modifier: le message d'erreur

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>
Était-ce utile?

La solution

essayez ceci:


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

Sans "VAR global", python souhaite utiliser la variable locale VAR et vous indique "UnboundLocalError: variable locale" VAR "référencée avant l'affectation".

Autres conseils

Ne le déclarez pas global, transmettez-le à la place et renvoyez-le si vous avez besoin d'une nouvelle valeur, comme ceci:

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

----

import bootstrap
b = bootstrap.initialize('testVar')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top