2009-01-30 10 views
11

Ich bin neu bei Python, also bitte entschuldigen Sie, was wahrscheinlich eine ziemlich dumme Frage ist.Verwirrung über globale Variablen in Python

Grundsätzlich habe ich eine einzige globale Variable namens _debug, die verwendet wird, um zu bestimmen, ob das Skript Debugging-Informationen ausgeben soll oder nicht. Mein Problem ist, dass ich es nicht in einem anderen Python-Skript als dem verwenden kann, das es verwendet.

Ich habe zwei Skripte:

one.py: 
------- 

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


two.py: 
------- 

from one import * 
_debug = False 

my_function() 

Lauf two.py erzeugt einen Fehler:

NameError: global name '_debug' is not defined 

Kann mir jemand sagen, was ich falsch mache?

Antwort

16

Es gibt mehr Probleme als nur die führende Unterstreichung, fürchte ich.

Wenn Sie my_function() aufrufen, wird die Variable debug in ihrem Namensraum immer noch nicht enthalten sein, es sei denn, Sie importieren sie von two.py.

Natürlich bedeutet dies, dass Sie mit zyklischen Abhängigkeiten enden (one.py -> two.py -> one.py), und Sie erhalten NameError s, es sei denn, Sie refafortieren, wo verschiedene Dinge importiert und deklariert werden.

Eine Lösung wäre, ein einfaches drittes Modul zu schaffen, die ‚Konstanten‘ wie folgt definiert, die sicher von überall aus importiert werden können, zum Beispiel:

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

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

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

Allerdings würde ich empfehlen, nur die in logging gebaut mit Modul dafür - warum nicht? Es ist einfach zu konfigurieren, einfacher zu bedienen, zuverlässig, flexibel und erweiterbar.

+0

Ja, das Logging-Modul ist der Weg, um hier zu gehen. –

5

Namen mit einem Unterstrich beginnen, werden nicht mit

importiert
from one import * 
+1

Und es ist, weil sie bedeuten, "das ist interne Sachen, berühren Sie es nicht, oder tun Sie es auf eigene Gefahr". –

+0

Ich bin wirklich geschockt, dass eine völlig falsche Antwort akzeptiert und so hoch gewählt wurde. –

+0

Nun, es ist nicht völlig falsch; kgiannakakis ist korrekt bei Namen, die mit Unterstrichen beginnen, die nicht importiert werden. Allerdings ist es richtig, dass dies immer noch nicht der Grund dafür ist, dass sein Beispielcode nicht funktioniert. Deine Antwort ist viel besser. –

4

Sie können auch verwenden, um die __debug__ Variable für das Debuggen. Es ist richtig, wenn der Interpreter nicht mit der Option -O gestartet wurde. Die assert-Anweisung könnte ebenfalls hilfreich sein.

1

Ein bisschen mehr Erklärung: Die Funktion my_function 's Namespace ist immer im Modul one. Das heißt, wenn der Name _debug nicht in my_function gefunden wird, wird in one nicht der Namespace gesucht, von dem die Funktion aufgerufen wird. Alabasters Antwort bietet eine gute Lösung.