Was ist der Umfang von if __name__ == __main__? Ist alles von dieser Aussage im globalen Raum abgedeckt?

8
Cemre 9 Okt. 2012 im 23:29

4 Antworten

Beste Antwort

Der if __name__ == '__main__' Block hat überhaupt nichts Besonderes. Das heißt, sein Umfang wird durch den Ort bestimmt, an dem er auftritt. Da solche Blöcke normalerweise auf oberster Ebene auftreten, ist ihr Umfang global.

Wenn dieser Block in einer Funktion auftreten würde, die vollkommen legal ist, wäre sein Gültigkeitsbereich lokal - mit der Ausnahme, dass __name__ immer noch in den im Modul definierten globalen Wert aufgelöst wird.

11
user4815162342 9 Okt. 2012 im 19:36

Es ist im globalen Geltungsbereich, solange:

  1. es wird im globalen Bereich aufgerufen, d. h. nicht innerhalb einer Funktion
  2. Es befindet sich in der Codedatei, die ausgeführt wird.

Zur Veranschaulichung von (2) :

Angenommen, Ihr Code befindet sich in foo.py und in bar.py haben Sie die Anweisung from foo import *. In diesem Fall wird der Block if __name__ == "__main__": in foo.py nicht ausgeführt. Dieser Block wird nur ausgeführt, wenn foo.py ausgeführt wird

1
inspectorG4dget 9 Okt. 2012 im 19:52
>>> if __name__ == '__main__':
...     x = 1
... print 'x' in globals()
True

Bearbeiten : user4815162342 weist darauf hin, dass diese if-Anweisung in jedem Bereich geschrieben werden kann. Es wird am häufigsten im globalen Bereich geschrieben.

Hier ist es in einer Funktion:

>>> def foo():
...     if __name__ == '__main__':
...         bar = 1
... foo()
... print 'bar' in globals()
False
5
Steven Rumbalski 9 Okt. 2012 im 19:40

Python hat keinen blocklokalen Bereich, daher werden alle Variablen, die Sie in einem if -Block verwenden, dem nächstgelegenen "echten" Bereich hinzugefügt. (Bei einem if..main Block handelt es sich normalerweise um Attribute des Moduls.)

3
millimoose 9 Okt. 2012 im 19:32