[PYTHON] Wenn __name__ == Heben Sie Ihre Hand, wenn Sie den Code unter '__ main__' schreiben.

Frohes neues Jahr. Zu Beginn des neuen Jahres habe ich Ihnen, Lehrer, etwas zu sagen.

Heben Sie im Python-Code Ihre Hand, wenn Sie den Code unter if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _' schreiben.

So schreibt jemand Code unter if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'.

#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys


def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)


if __name__ == '__main__':
    args = sys.argv[1:]
    assert args

    kind = args[0].lower()
    data_list = [x.lower() for x in args[1:]]

    say_args(kind, data_list)

Leute, die solchen Code schreiben, Lehrer, werden nicht böse, also heben Sie Ihre Hand.

Haben Sie bemerkt, dass ein solcher Code ** den globalen Bereichsnamensraum ** verschmutzt **? Wenn Sie sich dessen bewusst sind und es vor dem Schreiben verstehen, können Sie Ihre Hand fallen lassen.

if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'Below ist der globale Bereich

Ja, wenn \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _'Below der globale Bereich ist. Die dort definierten Variablen sind ** alle globalen Variablen **.

Im obigen Code werden `args```,` kind, `` data_list, die lokale Variablen sein sollen, zu globalen Variablen. Daher führt das Schreiben des folgenden Codes nicht zu einem Fehler.

def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)
    #Es wird auf die globale Variable args verwiesen, was bei Verweisen auf undefinierte Argumente nicht zu einem Fehler führt
    print("args: ", args)

Dies ist eine Quelle für lästige Fehler, kein Fehler bei direkter Ausführung, sondern ein Namensfehler beim Aufruf als Modul.

** Entlassen Sie also nicht die Sprachspezifikationen des Python-Lehrers. ** ** **

Dr. PyCharm ist ebenfalls wütend über diese Angelegenheit und sagt: "Shadows name'kind 'bilden den äußeren Bereich".

2017-01-01_11h04_25.png

Lösungen

Wenn Sie Code unter if \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _' schreiben möchten, schließen Sie ihn in eine Funktion ein.

#! usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, absolute_import
import sys


def main(args):
    assert args

    kind = args[0].lower()
    data_list = [x.lower() for x in args[1:]]

    say_args(kind, data_list)


def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)


if __name__ == '__main__':
    main(sys.argv[1:])

Der globale Bereichsnamensraum wird nicht durch das Umschließen der Hauptfunktion verschmutzt. Wenn Sie es in die Hauptfunktion einschließen, können Sie den Hauptprozess zu Beginn schreiben, wodurch die Sichtbarkeit des Codes verbessert wird.

Wenn Sie Python noch nicht kennen, können Sie es sicher in eine Funktion einbinden.

Wenn Sie sich wegen anderer Dinge Sorgen machen, verwenden Sie bitte Herrn PyCharm, der wie eine kleine Schwiegermutter ist, aber auf die schlechten Punkte des Take-Home-Codes hinweist. ~~ pyflask Sensei ~~ pyflakes Sensei und pylint Sensei sind in Ordnung, aber pylint Sensei ist strenger. (1/1 Korrektur: Es gibt keinen Pyflask-Lehrer, es war ein Fehler des Pyflakes-Lehrers)

Das ist alles, was der Lehrer sagen wollte.

Wenn Sie es dann als Modul verwenden möchten, können Sie eine nutzlose Hauptfunktion erstellen, wenn Sie sie in die Hauptfunktion einschließen.

Ich habe eine Make-up-Klasse geschrieben

[[Zusatzvorlesung] Wenn \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _', heben Sie bitte Ihre Hand](http://qiita.com/pashango2/ items / 3834221353e4d25e0d69)

2017-01-02 Korrigiert um Variable "x"

Wir werden es als Antwort auf Herrn Knoguchis Kommentar korrigieren. Wenn Sie Korrekturen im Artikel vornehmen, ist es schwierig, den Artikel zu lesen, sodass er an das Ende des Satzes verschoben wurde.

** [Satz vor Korrektur] ** Im obigen Code ist `args```,` kind, `` data_list, die als lokale Variable gedacht ist, ~~ sogar die temporäre Variable `` `x``` ~~ global Es wird eine Variable.

def say_args(kind, data_list):
    print("kind:", kind, " data:", data_list)
    #Es wird auf eine globale Variable x verwiesen, die beim Verweisen auf ein undefiniertes x nicht zu einem Fehler führt
    print("x: ", x)

`` `x```, das in der Einschlussnotation verwendet wird, ist keine globale Variable, sondern führt zu einem Fehler.

Es scheint jedoch keinen Fehler zu verursachen, wenn PyCharm ausgeführt wird, da PyCharm globale Frames für die Geschwindigkeit wiederverwendet. Es ist eine Lektion, dass es beim Überprüfen der Ergebnisse nicht nur darum geht, auf PyCharm zu laufen.

Ich möchte Herrn Knoguchi noch einmal danken. "Das Leck der Variablen zur Vervollständigung der Liste ist ein Problem beim erneuten Binden" im Kommentar ist einer der süchtig machenden Punkte in der Einschlussnotation. Lesen Sie daher auch den Kommentar.

Recommended Posts

Wenn __name__ == Heben Sie Ihre Hand, wenn Sie den Code unter '__ main__' schreiben.
[Ergänzungskurs] Wenn __name__ == Wenn Sie den Code unter '__ main__' schreiben, heben Sie Ihre Hand.
[Python-Anfänger] Wenn __name__ == Bewegen Sie Ihre Hand, um '__ main__' zu verstehen.
Wenn Sie möchten, dass Ihre Kollegen dieselbe Sprache verwenden
Wenn Sie Titanic fahren ... sterben Sie.
Überprüfen Sie den Dateinamen, wenn Sie durch Python-Import nicht informiert werden
Wenn Sie der Meinung sind, dass die PyCharm-Umgebung beschädigt ist, liegt dies am Dateinamen
Wenn Sie View decorator in urls.py in Django schreiben, ist die Liste höher.
Wenn Sie so viel wissen, können Sie Python-Testcode schreiben! ~ Super Einführungsausgabe ~