Hallo zusammen. Wenn \ _ \ _ name \ _ \ _ == '\ _ \ _ main \ _ \ _', heben Sie Ihre Hand, die den Code träge schreibt Hat 100 Likes überschritten, danke. Lehrer, ich habe jedem etwas zu erzählen.
Jeder, die Warnung "Shadows name" wird übersehen. Erklären Sie den Schrecken von "Shadows name", der durch die Verschmutzung des globalen Bereichs verursacht wird.
Entschuldigen Sie das knifflige Beispiel, aber nehmen Sie an, Sie haben den folgenden Code:
import sys
def process(n):
x = 0
# ...Verschiedene Verarbeitung
if x > 1:
n *= 10
# ...Verschiedene Verarbeitung
return n
if __name__ == '__main__':
for x in sys.argv[1:] or [1, 2, 3]:
process(int(x))
Aus irgendeinem Grund muss ich die Prozessfunktion nicht mehr starten, daher habe ich die Variable "x" auskommentiert. Ich habe jedoch die Variable "x" übersehen, die in der mittleren Phase im Code vergraben war.
def process(n):
#Kommentar hier raus
# x = 0
# ...Verschiedene Verarbeitung
# !!!!Ich habe vergessen, einen Kommentar abzugeben!!!!
if x > 1:
n *= 10
# ...Verschiedene Verarbeitung
return n
In diesem Fall wird "x" als globale Variable referenziert, sodass kein Fehler auftritt und von statischen Analysewerkzeugen nicht erkannt wird.
Einfache Fehler in Python können durch eine statische Analyse von 99% erkannt werden, aber "Shadows name" ist ein böser Fehler, der durch ihn hindurchschlüpft. Wenn Sie die statische Analyse umgehen, müssen Sie auch nur einen Kommentar genau beachten.
** Entlassen Sie also nicht die Sprachspezifikationen des Python-Lehrers. ** **.
Natürlich war das vorherige Beispiel eine extreme Situation, aber es ist durchaus möglich. Wenn Sie das Risiko eingehen, einen solchen lästigen Fehler zu verursachen, ist es einfacher, das unter "if name ==" __ main __ "so schnell wie möglich in eine Funktion einzubinden.
Tatsächlich warnt Sie ein Tool wie PyCharm, das statische Analysen in Echtzeit durchführt, beim Schreiben Ihres Codes, sodass dieses Problem möglicherweise nicht sehr häufig auftritt.
Wenn Sie die Warnung jedoch ignorieren oder deaktivieren, geschieht dies. Zum Schweigen gebrachter Lehrer PyCharm ...
Die statischen Analysetools von Python verhindern auch manchmal verwirrende Fehler. Es ist wichtig, dass Sie Ihren Code in einem grünen Zustand halten, damit Sie die Warnung nicht überfordern.
Erstens ist if __name__ == '__ main __'
der Ort, an dem der Prozess geschrieben werden soll, den Sie nur in der Skriptumgebung der obersten Ebene ausführen möchten.
Was also ein Top-Level-Skript ist, ist das ** "Hauptmodul" **, das direkt von Python ausgeführt wird. Vom Hauptmodul oder anderen Skripten importierte Skripte werden einfach ** "Module" ** genannt.
https://docs.python.jp/3/tutorial/modules.html
Skripte, die nur als Hauptmodul ausgeführt werden, benötigen grundsätzlich kein "if name ==" __ main__ ". Da "name" nur "main" enthalten kann, ist es sinnlos, nur eine if-Anweisung zu schreiben.
** "Dann müssen Sie nicht schreiben, wenn name == '__ main__` im Hauptmodul" **
Es wird sein.
Die Meinung des Lehrers ist ** "Wenn Sie Code in das Hauptmodul schreiben möchten, sollten Sie" if name == '__ main__` "** schreiben.
Zum Beispiel, wenn Sie das folgende Hauptmodul haben:
import sys
def main(args=sys.argv):
#Was für ein Chaos
return 0
if __name__ == "__main__":
sys.exit(main())
Dies ist ein typischer Hauptmodulprozess.
Das Hauptmodul ohne if __name__ == '__ main__
sieht folgendermaßen aus:
import sys
def main(args=sys.argv):
#Was für ein Chaos
return 0
sys.exit(main())
Die beiden machen dasselbe, aber das zweite Hauptmodul hat nur ein Problem.
** Andere können keine Affenpflaster **
darüber.
Monkey Patch ist eine Technik, die das Verhalten einer vorhandenen Bibliothek missbraucht und dynamisch neu schreibt.
[Monkey Patch Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3 % 83% 83% E3% 83% 81)
Im Artikel des Lehrers finden Sie ein Beispiel für ein Affenfeld.
Ich habe "sphinx-quickstart-plus" erstellt, um die Sphinx-Dokumentation bequemer zu gestalten
Mit anderen Worten, wenn jemand anderes Ihr Skript erweitern möchte, ohne "if name ==" __ main__ ", ist es schwierig, den Code zu patchen.
Angenommen, Sie haben ein Hauptmodul namens "a.py" wie folgt:
a.py
import sys
def main(args=sys.argv):
#Was für ein Chaos
return 0
sys.exit(main())
Wenn Sie versuchen, diese "a.main" -Funktion als Affen-Patch (Erweiterung) zu importieren, wird das Programm beendet.
monkey.py
import a
print("monkey patch")
a.main([])
Daher ist es sicherer (nicht erforderlich), "if name ==" __ main__ "auch in das Hauptmodul zu schreiben.
If __name__ == '__ main__
ist jedoch für Beispielcode und verlassenen Code nicht erforderlich.
Dies sind die beiden Dinge, die der Lehrer sagen möchte.
――Dirty Global Scope ist ein Vorgang, der die Zuverlässigkeit der statischen Analyse verringert. Guilty!
das ist alles.
Recommended Posts