In diesem Handbuch werden Sie die Funktionalität und Bedeutung von verstehen if __name__ == '__main__' bei Python.

Haben Sie jemals eine Python-Codebasis mit verschiedenen Modulen überflogen?

Wenn ja, sind Sie wahrscheinlich auf die Bedingung if __name__ == '__main__' in einem oder mehreren Modulen gestoßen. In den nächsten Minuten entmystifizieren wir die Bedeutung der obigen Bedingung und sehen uns ein Beispiel an, wo sie hilfreich sein kann.

Lassen Sie uns beginnen!

Was ist die Bedeutung von __name__ in Python?

Was ist die Bedeutung von __name__ in Python?

In Python, ein Modul ist a .py Datei, die Funktionsdefinitionen, einen Satz auszuwertender Ausdrücke und mehr enthält. Wenn wir beispielsweise eine Datei mit dem Namen hello_world.py haben, bezeichnen wir diese als die Datei hello_world.py oder die hello_world Modul.

Wenn Sie ein Python-Modul ausführen, wird die Python-Interpreter setzt die Werte für einige spezielle Variablen vor der Ausführung: __name__ Ist einer von ihnen. Der Schlüssel zum Verständnis der Bedeutung   __name__ versteht, wie Importe in Python funktionieren.

📁 Laden Sie den Code für diesen Abschnitt hier herunter.

Gehen Sie zum Ordner example-1. Wir haben die Datei module1.pydem „Vermischten Geschmack“. Seine __name__ Variable befindet sich im Namensraum des aktuellen Moduls.

Dieses Modul druckt eine Zeile gefolgt vom Wert von aus __name__ variabel.

# example-1/module1.py
print("This is module1.")
print(f"The __name__ variable of module 1 is: {__name__}.")

Jetzt lass uns laufen module1 von der Befehlszeile aus.

$ python module1.py

In der Ausgabe sehen wir, dass die __name__ Variable ist auf gesetzt __main__.

This is module1.
The __name__ variable of module 1 is: __main__.

Importieren von Modulen in Python

Zusätzlich zum Ausführen eines Python-Moduls möchten Sie möglicherweise manchmal Funktionen aus einem anderen Python-Modul innerhalb des aktuellen Moduls verwenden. Python erleichtert dies durch Importe.

Durch Importe können Sie die Funktionalität eines anderen Moduls wiederverwenden – indem Sie es in den Gültigkeitsbereich des aktuellen Moduls importieren – ohne den Code neu schreiben zu müssen.

Importieren von Modulen in Python

Auch der module2.py Datei enthält Folgendes. Wir haben importiert module1 innen. module2.

# example-1/module2.py

import module1 # module1 is imported

print(f"This is module2")
print(f"The __name__ variable of module2 is: {__name__}.")

Wir rennen module2.py und beobachten Sie die Ausgabe.

$ python module2.py

In der Ausgabe unten:

  • Wir sehen das module1 wird unter der Haube ausgeführt, wenn wir es nach innen importieren module2, und die entsprechende Ausgabe wird ausgedruckt.
  • Aber dieses Mal ist die Variable __name__ nicht __main__ sondern module1.
  • Weil wir gelaufen sind module2 direkt ist die dem Modul entsprechende __name__-Variable jetzt __main__.
Output

This is module1.
The __name__ variable of module 1 is: module1.
This is module2
The __name__ variable of module2 is: __main__.

???? Schlüsselidee:

– Wenn ein Modul direkt ausgeführt wird, wird seine Variable __name__ auf ist gleich gesetzt __Main__

– Wenn ein Modul in ein anderes Modul importiert wird, wird sein __name__ auf gesetzt Name des Moduls.

Beispiel für if __name__=='__main__' in Python

Beispiel für if __name__=='__main__' in Python

In diesem Abschnitt sehen wir einen praktischen Anwendungsfall der Bedingung if __name__ == '__main__'. Wir definieren eine einfache Funktion und schreiben dann Komponententests, um zu überprüfen, ob die Funktion wie erwartet funktioniert.

📁 Laden Sie den Code herunter und folgen Sie ihm.

Den Code für diesen Abschnitt finden Sie in der example-2 Ordner.

Hier add.py ist eine Python-Datei, die die Definition der Funktion enthält add_ab().Die Funktion add_ab() nimmt zwei beliebige Zahlen auf und gibt ihre Summe zurück.

# example-2/add.py

def add_ab(a,b):
    return a + b
Gerätetest

Wir werden Pythons verwenden unittest Modul um die Funktion zu testen add_ab().

Schreiben von Testfällen für eine Python-Funktion

Sehen Sie sich das Code-Snippet unten an, das den Inhalt der enthält test_add Modul.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)
    

Der obige Code macht folgendes:

  • Importiert Pythons eingebaute Gerätetest Modul
  • Importiert die Funktion add_ab() von dem add Modul
  • Definiert die Testklasse TestAdd und eine Reihe von Testfällen als Methoden innerhalb der Testklasse

Um Komponententests für Ihren Code einzurichten, sollten Sie zunächst eine Testklasse definieren, die erbt von unittest.TestCase. Alle Testfälle sollten als Methoden innerhalb der Klasse angegeben werden und mit beginnen test_.

Hinweis: Wenn Sie die Methoden nicht als benennen test_<some-descriptive-name>, sehen Sie, dass die entsprechenden Tests nicht erkannt und daher nicht ausgeführt werden.

Lassen Sie uns nun versuchen, die auszuführen test_add Modul vom Terminal.

$ python test_add.py

Sie werden sehen, dass keine Ausgabe erfolgt und keiner der Tests ausgeführt wurde.

Warum ist das der Fall?🤔

Dies liegt daran, dass Sie zum Ausführen der Komponententests ausführen sollten unittest als Hauptmodul während der Ausführung test_add.py, mit dem folgenden Befehl.

$ python -m unittest test_add.py

Beim Ausführen des obigen ausführlichen Befehls sehen wir, dass alle drei Tests erfolgreich ausgeführt wurden.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Es wird jedoch bequem sein, die Tests bei diesem Modul auszuführen test_add läuft, ja? Lassen Sie uns im nächsten Abschnitt lernen, wie das geht.

Verwenden von if __name__ == '__main__' zum Ausführen von unittest als Hauptmodul

Führen Sie unittest als Hauptmodul aus

Wenn Sie alle Komponententests ausführen möchten, wenn das Modul direkt ausgeführt wird, können Sie die Bedingung hinzufügen.

# example-2/test_add.py

import unittest
from add import add_ab

class TestAdd(unittest.TestCase):
    def test_add_23(self):
        self.assertEqual(add_ab(2,3), 5)
    
    def test_add_19(self):
        self.assertEqual(add_ab(1,9), 10)
    
    def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), -6)

# Run unittest as the main module
if __name__ == '__main__':
        unittest.main()

Die Bedingung im obigen Code-Snippet sagt dem Python-Interpreter: Wenn dieses Modul direkt ausgeführt wird, dann führe den darin enthaltenen Code aus. unittest.main().

Sie können das ausführen test_add -Modul, nachdem Sie die beiden obigen Codezeilen hinzugefügt haben.

$ python test_add.py

▶️ Das direkte Ausführen des Test-Hinzufügen-Moduls führt jetzt alle drei Tests aus, die wir definiert haben.

Output
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Die obige Ausgabe OK zeigt an, dass alle Tests erfolgreich ausgeführt wurden. Die drei Punkte … zeigen an, dass drei Tests durchgeführt und alle bestanden wurden.

Lassen Sie uns nun den erwarteten Rückgabewert ändern test_add_1_minus7 bis 8. Da die Funktion in diesem Fall – 6 zurückgibt, sollte es einen fehlgeschlagenen Test geben.

def test_add_1_minus7(self):
        self.assertEqual(add_ab(1,-7), 8)

Wie in der Ausgabe unten zu sehen ist, erhalten wir .F., von den drei Tests ist einer fehlgeschlagen (der zweite Test), und im Traceback erhalten wir a AssertionError Angabe – 6 != 8.

Output
.F.
======================================================================
FAIL: test_add_1_minus7 (__main__.TestAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_add.py", line 12, in test_add_1_minus7
    self.assertEqual(add_ab(1,-7), 8)
AssertionError: -6 != 8

----------------------------------------------------------------------
Ran 3 tests in 0.021s

FAILED (failures=1)

Eine wichtige Sache zu beachten ist, dass die Tests nicht unbedingt in derselben Reihenfolge ausgeführt werden, in der sie in der Testklasse angegeben sind. Im obigen Beispiel test_add_1_minus7 ist als dritte Methode in der Testklasse definiert, aber der entsprechende Test wurde als zweites ausgeführt.

Summieren

Ich hoffe, dieses Tutorial hat Ihnen geholfen zu verstehen, wie die Bedingung if __name__ == '__main__' in Python funktioniert. 

Hier ist eine kurze Zusammenfassung der wichtigsten Takeaways:

  • Der Python-Interpreter setzt die __Name__ -Variable, bevor Sie das Python-Skript ausführen.
  • Wenn Sie ein Modul direkt ausführen, wird der Wert der __Name__ is __Main__.
  • Wenn Sie ein Modul in ein anderes Python-Skript importieren, wird der Wert der __Name__ ist der Modulname.
  • Sie können verwenden if __name__ == '__main__' um die Ausführung zu steuern und welche Teile des Moduls bei direkten bzw. importierten Läufen ausgeführt werden.

Sehen Sie sich als Nächstes diese ausführliche Anleitung an Python-Sets. Viel Spaß beim Lernen!🎉