217
Wir machen daraus ein importierbares Modul
>
Schreibe eine Funktion
n_eck_demo()
, die das Bild zeichnet, das am
Anfang dieses Abschnitts zu sehen ist! (Hinweis: Importiere
jump()
aus
mytools
!). Füge als letzte Anweisung des Programms einen Auf-
ruf von
n_eck_demo()
an.
>
Sichere das Programm, teste es und korrigiere es, falls Fehler aufge-
treten sind!
Wir machen daraus ein
importierbares Modul
Nichts ist einfacher als das: Wir speichern das Programm unter einem pas-
senden Namen, ich schlage vor
polygon.py
(Polygon ist der geometrische
Fachausdruck für Vieleck), im Verzeichnis
C:\py4kids\mylib
ab.
Da dieses Verzeichnis bereits im Suchpfad von Python liegt, können wir
jetzt
n_eck()
wie gewohnt importieren:
>>> from polygon import n_eck
>
Schließe alle IDLE-Fenster, starte den IPI neu und führe direkt diese
import
-Anweisung aus.
Der
import
funktioniert zwar, hat aber eine unerwünschte Nebenwirkung:
die Funktion
n_eck_demo()
wird ausgeführt. Das liegt daran, dass sie in
der letzten Zeile von
polygon.py
aufgerufen wird.
Die
import
-Anweisung
bewirkt die Ausführung
von
n_eck_demo
()
. Nicht
g
ut!
218
Mehr Schleifen: Friedenslogo, Superrosette
Kapitel
8
Ohne Zweifel ist das ein Verhalten, das beim Import von Modulen nicht
erwünscht ist. Wer will schon jedes Mal vier Vielecke vorgeführt bekom-
men, wenn er die Funktion
n_eck()
benötigt?
Du hast hier eine Situation, in die du beim Programmieren öfters kommst:
Du hast eine Datei voll Python-Code geschrieben, die eine oder mehrere
Funktionsdefinitionen enthält. Am Ende der Datei stehen Anweisungen, die
die darüber stehenden Funktionen benutzen und sofort ausgeführt werden
sollen. Oft sagt man, diese Anweisungen stellen das »Hauptprogramm« dar.
Diese Datei soll nun auf zwei verschiedene Weisen verwendbar sein:
0
Als selbstständig ausführbares Programm (stand alone program). Bei-
spielsweise, indem man es in ein Editor-Fenster lädt und dann mit
R
UN
|R
UN
M
ODULE
oder
(F5)
ausführt.
0
Als Modul einer Programmbibliothek, um die vielen schönen Funktionen
in anderen Programmen benutzen zu können. Das tut man, indem man
mit einer
import
-Anweisung alle oder auch nur einzelne Funktionen
des Moduls importiert. In diesem Fall dürfen nur die Funktionsdefini-
tionen ausgeführt werden, alle Anweisungen des Hauptprogramms aber
nicht.
In Python kann man das einfach erreichen: Man schreibt die Anwei-
sung(en) des »Hauptprogramms« – eingerückt! – in eine besondere
if
-
Anweisung:
if __name__ == "__main__":
n_eck_demo()
Diese Möglichkeit beruht auf folgendem Sachverhalt: Python verwendet
einen speziellen eingebauten Namen:
__name__
. Er beginnt und endet mit
zwei Unterstrichen. Dieser verweist auf einen String, abhängig davon, wie
ein Modul genutzt wird. Wird er importiert, dann wird
__name__
der Name
des Moduls ohne die Erweiterung
.py
zugewiesen. Wird ein Modul als
Programm ausgeführt, dann verweist
__name__
auf den String
"__main__"
.
>
Prüfe das nach, indem du
polygon.py
in einem Editor-Fenster öff-
nest und vorübergehend die Anweisung
print(
"Name:",
__name__)
in das Modul
polygon.py
einfügst! Dein Listing könnte dann etwa
so (oder ähnlich, je nachdem wie du
n_eck_demo()
programmiert
hast) aussehen:
219
Wir machen daraus ein importierbares Modul
def n_eck_demo():
reset()
pensize(3)
right(90)
jump(-185)
for ecken in (3, 4, 5, 6):
n_eck(ecken, 40)
jump(ecken*24)
print(
"Name:",
__name__)
n_eck_demo()
>
Führe nun das Programm mit
(F5)
aus. Die
print
-Anweisung gibt aus:
>>>
Name: __main__
>>>
>
Um zu sehen, was beim
import
geschieht, starte den IPI neu und
importiere
n_eck()
aus dem Modul
polygon
. Jetzt zeigt die
print
-
Anweisung, dass
__name__
einen anderen Wert hat, nämlich den
Modul-Namen.
>>> from polygon import n_eck
Name: polygon
>>>
>
Entferne die
print
-Anweisung in
polygon.py
wieder und setze den
n_eck_demo()
-Aufruf in die beschriebene
if
-Anweisung:
if __name__ == "__main__":
n_eck_demo()
Nun wird
n_eck_demo()
nur noch ausgeführt, wenn das Skript ausgeführt
wird, aber nicht mehr, wenn daraus etwas importiert wird, denn dann ist ja
die Bedingung in der
if
-Anweisung nicht erfüllt. (Falls dein Hauptpro-
gramm aus mehreren oder auch vielen Anweisungen besteht, können sie
alle im Block dieser
if
-Anweisung untergebracht werden.)
Beachte, dass
__name__
und
__main__
und viele »spezielle Namen« in
Python mit zwei Unterstrichen beginnen und mit zwei Unterstrichen en-
den. Erfinde niemals selbst Namen mit dieser Besonderheit. Es besteht
sonst die Gefahr, dass deine Namen mit wichtigen speziellen Namen von
Python in Konflikt geraten – mit unvorhersehbaren Folgen!

Get Python für Kids now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.