30. Montage des Programms

Wir sammeln die einschlägigen Funktionen in einer Datei gener1.py. Damit das ein komplettes Programm wird, schreiben wir ans Ende der Datei:

if __name__=="__main__":
  try:
    rules = readRules(sys.argv[1])
  except IOError:
    sys.stderr.write("Couldn't open %s\n"%
      sys.argv[1])
    sys.exit(1)
  generate("S", rules, int(sys.argv[2]))

In name__ steht der Name, unter dem das Modul importiert wurde. Wenn das Modul direkt aufgerufen wurde, enthält es den String __main__. Die Abfrage sorgt dafür, dass der folgende Code nicht ausgeführt wird, wenn das Modul per import ausgeführt wird.

sys.argv ist eine Liste der Kommandozeilenparameter.

examples> cat printargs.py
import sys
print sys.argv
examples> python printargs.py a 43 par par
['printargs.py', 'a', '43', 'par', 'par']

sys.argv[0] ist der Name des Skripts.

sys.exit beendet das Skript und gibt sein Argument an die Shell zurück. Konventionell geben Programme Null zurück, wenn alles ok ist und eine kleine positive Zahl bei Fehlern.

examples> gener1.py num.grammar 3
1
2
11
12                  examples> cat num.grammar
111                 V->+
112                 V->-
121                 Z->1
122                 Z->2
21                  S->N
22                  N->Z
211                 N->ZN
212                 S->VN
221                 S->N.N
222                 S->VN.N
+1
+2
+11
+12
+21     -21
+22     -22
-1      1.1
-2      1.2
-11     2.1
-12     2.2

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Macht euch klar, wann Python welchen Code in eurem Modul ausführt: Funktionen erst dann, wenn sie aufgerufen werden, Code außerhalb der Funktion beim ersten Importieren des Moduls, und das, was durch unsere Bedingung an __name__ “geschützt” ist nur dann, wenn das Modul direkt von der Kommandozeile gestartet wurde. Testet das am Besten durch ein print __name__ außerhalb jeder Funktion. Wird dieser Code auch bei einem reload ausgeführt?

(2)

Macht euch klar, wie das mit dem sys.argv funktioniert. Erweitert z.B. das printargs-Programm oben so, dass es seine Argumente sortiert, oder macht etwas wie das Unix-Programm cat daraus, indem ihr alle Argumente außer dem Nullten als Dateinamen interpretiert und den Inhalt der Dateien auf die Standardausgabe ausgebt.

(3)

num.grammar erzeugt schon für kleine maximale Längen Unmengen von Wörtern. Versucht, ob ihr euren Rechner mit der Wahl größerer maximaler Längen in die Knie zwingen könnt.

Dateien zu diesem Abschnitt


Markus Demleitner

Copyright Notice