Xpert.press Die Reihe Xpert.press vermittelt Professionals in den Bereichen Softwareentwicklung, Internettechnologie und IT-Management aktuell und kompetent relevantes Fachwissen über Technologien und Produkte zur Entwicklung und Anwendung moderner Informationstechnologien. Mark Pilgrim Python 3 – Intensivkurs Projekte erfolgreich realisieren Übersetzt aus dem Amerikanischen von Florian Wollenschein 1 3 Mark Pilgrim 101 Forestcrest Court Apex NC 27502 USA [email protected] Übersetzer Florian Wollenschein Wertheimer Straße 21 97828 Marktheidenfeld Deutschland [email protected] Übersetzung aus dem Amerikanischen mit freundlicher Genehmigung des Autors. Titel der amerikanischen Originalausgabe: Dive into Python 3, Apress 2009. ISBN 978-3-642-04376-5 e-ISBN 978-3-642-04377-2 DOI 10.1007/978-3-642-04377-2 Springer Heidelberg Dordrecht London New York Xpert.press ISSN 1439-5428 Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. Springer-Verlag Berlin Heidelberg 2010 Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes der Bundesrepublik Deutschland vom 9. September 1965 in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen des Urheberrechtsgesetzes. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Einbandentwurf: KünkelLopka GmbH, Heidelberg Gedruckt auf säurefreiem Papier Springer ist Teil der Fachverlagsgruppe Springer Science+Business Media (www.springer.com) Vorwort Geschichte einer Übersetzung Es begann im April 2009. Ich hatte gerade nichts Wichtiges zu tun, da kam mir die Idee, Dive Into Python (das englische Original der älteren Version dieses Buches) ins Deutsche zu übersetzen. Erfahrung im Übersetzen und in der Programmierung hatte ich über die letzten Jahre gesammelt. Probleme sollte es also nicht geben. Doch: vielleicht eins. Ich wusste nicht, ob DIP, wie ich es mittlerweile nenne, bereits ins Deutsche übersetzt war (immerhin hatte es schon über fünf Jahre auf dem Buckel). Ein Besuch der Homepage brachte aber schnell Klarheit und es stellte sich heraus, dass es bisher keine deutsche Übersetzung gab. Sodann beschloss ich frohen Mutes die Idee in die Tat umzusetzen und schrieb Mark Pilgrim eine E-Mail mit einem Hinweis darauf. Einen Tag (es können auch zwei gewesen sein) später antwortete er auch schon mit der Mitteilung, dass bereits Dive Into Python 3 in Arbeit sei und ich doch vielleicht lieber das übersetzen solle, da DIP veraltet sei und in nächster Zeit auch nicht aktualisiert werde. Gut, dachte ich mir, dann eben DIP 3! Je aktueller, desto besser. Ich begann sofort mit der Übersetzung. Am 18. Mai 2009 stöberte ich ein wenig im Internet und stieß eher zufällig auf das Impressum der amerikanischen Ausgabe von DIP, die bei Apress erschienen war. Springer-Verlag, Heidelberg, Germany fiel mir sofort ins Auge. Offensichtlich gehörte Apress also zum deutschen Springer-Verlag. Mir kam ein Gedanke, der sich im Nachhinein als nicht so abwegig herausstellte, wie ich anfangs vermutet hatte. Eine E-Mail an Springer musste her. Ich surfte also zu springer.com und klickte mich zum Kontaktformular. Ich fragte, ob sie Interesse daran hätten, Dive Into Python 3 auf Deutsch herauszubringen. Die Chance überhaupt eine – nicht automatisch generierte – Antwort zu erhalten, schätzte ich damals auf etwa 25 Prozent. Warum gerade 25 Prozent? Sagen wir vielleicht lieber, es erschien mir recht unwahrscheinlich. Springer ist immerhin der zweitgrößte Wissenschaftsverlag der Welt. Warum sollte gerade dieser riesige Verlag sich für die Idee eines jungen Übersetzers erwärmen? Ich sollte eines Besseren belehrt werden. Dorothea Glaunsinger, die Assistentin des für den Informatik-Bereich zuständigen Lektors Hermann Engesser, antwortete bereits nach kurzer Zeit vi Vorwort und teilte mir mit, dass es in der Tat eine sehr interessante Idee sei. Wenn möglich sollte ich ein Probekapitel senden, damit sie sich ein Urteil über meine Übersetzung bilden könnten. Hermann Engesser melde sich dann bei mir. Ich schickte meine zwei, bereits fertigen, Kapitel per E-Mail an Frau Glaunsinger und war nun aufgeregter denn je. Werden sie die Übersetzung positiv aufnehmen? (Nun, Sie wissen bereits, wie die Geschichte ausgegangen ist, da Sie dieses Buch nun in Händen halten, doch ich wusste es damals nicht.) Nachdem Frau Glaunsinger mir bereits kurze Zeit später geschrieben hatte, dass die Probekapitel sehr gut seien, teilte mir auch Herr Engesser später sein Urteil mit. Sehr gut, meinte auch er. Hätte ich Champagner gehabt – würde ich überhaupt Champagner trinken – hätte ich mir nun eine Flasche aufgemacht. Sie müssen wissen, dass dies mein erster Versuch war, bei einem richtigen Verlag zu veröffentlichen. Wenn man dann ein so positives Feedback erhält, ist das wie ein Sechser im Lotto … oder … nein, sagen wir lieber wie ein Fünfer mit Zusatzzahl. Der Sechser kommt erst noch. Nach weiteren E-Mails kam das erste Telefonat mit Hermann Engesser, meinem Lektor in Spe (und das meine ich in der wörtlichen Übersetzung „in der Hoffnung“). Es wurden hauptsächlich rechtliche Fragen besprochen und ich sollte Mark Pilgrim mitteilen, dass er doch bitte seine Erlaubnis zur Veröffentlichung an Springer sendet. Abschließend fragte ich, wie hoch er die Wahrscheinlichkeit einer Veröffentlichung einschätze. 80:20. Wow! Ich versuchte cool zu bleiben, was mir aber – auch bei unserem zweiten Telefonat – nicht sehr gut gelang. Doch auch Hermann Engesser klang immer so begeistert, dass er mich damit ansteckte. Nachdem auch die Marketingleute das Projekt abgesegnet hatten, rief mich Herr Engesser am 20. Juli, also fast genau zwei Monate nach meiner ersten Kontaktaufnahme, erneut an. Er werde mir einen Vertrag zuschicken. Diesen Vertrag erhielt ich in dreifacher Ausfertigung. Als ich alle drei Exemplare unterschrieben hatte, schickte ich sie weiter an Mark Pilgrim nach North Carolina (die Deutsche Post berechnete dafür sechs Euro, die es mir aber mehr als wert waren). Parallel dazu erschien auf springer.com bereits „unser“ Buch. Der Grafiker (oder die Grafikerin), der/die den Umschlag gestaltet hat, hat wirklich ganze Arbeit geleistet. Sehen Sie doch einfach selbst nach. Die Schlange in den Händen des Männleins ist doch ein toller Verweis auf Python. Leider war die deutsche (oder die amerikanische) Post nicht in der Lage den Vertrag auszuliefern. Die Gründe dafür werde ich wohl niemals erfahren. Als er auch nach vier Wochen noch nicht bei Mark Pilgrim angekommen war, schickte Frau Glaunsinger den Vertrag per E-Mail an ihn. Kurze Zeit später erhielt ich zwei unterschriebene Exemplare zurück und sendete eines davon unverzüglich nach Heidelberg. Damit war nun also auch rechtlich alles in trockenen Tüchern. Unterdessen übersetzte ich den restlichen Text und führte schließlich die Formatierung des Manuskripts aus. Die letze Seite stellte ich an einem Samstagmorgen fertig. Ich kann nur sagen, dass die Arbeit an diesem Buch eine unglaubliche Erfahrung für mich war. Ein halbes Jahr Arbeit meinerseits steckt zwischen den beiden Buchdeckeln. Ein halbes Jahr Nachtschichten, Wochenendarbeit und ab und zu ein klein wenig Ärger mit meinem PC. Ich hoffe, dass sich diese Arbeit gelohnt hat und Sie Vorwort vii einiges aus diesem Buch lernen und in der Praxis anwenden werden. Sie finden in diesem Werk in sehr kompakter Form alle wichtigen Elemente, die Python 3 zu bieten hat. Über Feedback freue ich mich sehr; besuchen Sie einfach python3-intensivkurs. de oder florianwollenschein.de und setzen Sie sich mit mir in Verbindung. Wenn Sie Mark Pilgrim etwas zukommen lassen möchten, surfen Sie zu diveintomark.org. Unter python3-intensivkurs.de finden Sie außerdem den in diesem Buch verwendeten Beispielcode zum Herunterladen. Nun wünsche ich Ihnen viel Spaß und Erfolg bei der Arbeit mit diesem Buch. November 2009 Florian Wollenschein Danksagung Danksagung von Mark Pilgrim Ich danke meiner Frau, die mit ihrer nie enden wollenden Unterstützung und Ermutigung dazu beigetragen hat, dass dieses Buch nicht nur ein weiterer Punkt auf meiner To-Do-Liste ist. Mein Dank gilt Raymond Hettinger, dessen Alphametik-Löser die Grundlage des achten Kapitels bildet. Ebenso danke ich Jesse Noller dafür, dass sie mir während der PyCon 2009 so viele Dinge erklärt hat, die ich somit jedem anderen erklären konnte. Schließlich danke ich den vielen Menschen, die mir während des Schreibens ihr Feedback zukommen ließen, insbesondere gilt mein Dank Giulio Piancastelli, Florian Wollenschein und all den netten Menschen von python.reddit.com. Danksagung des Übersetzers Mein Dank gilt zu allererst Mark Pilgrim, der diese Übersetzung mit seinem Buch und seiner unglaublichen Unterstützung während der ganzen Monate überhaupt erst möglich gemacht hat. Thank you very much, Mark. Außerdem danke ich Hermann Engesser, Dorothea Glaunsinger und Gabriele Fischer vom Springer-Verlag. Alle drei haben das Projekt voller Begeisterung betreut und mir immer und immer wieder Fragen beantwortet. Es waren harte (und dennoch schöne) Wochen dieses Buch zu übersetzen und so gilt mein Dank auch und ganz besonders Daniela, die mir Tag für Tag unter die Arme gegriffen hat. Meine Eltern Jürgen und Cornelia, meine Schwester Sarah und meine Oma Margarete darf ich nicht außen vor lassen … Hey, es ist endlich gedruckt!!! ix Inhaltsverzeichnis 1 Python installieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Welche Python-Version ist die Richtige für Sie? . . . . . . . . . . . . . . . . 1 1.3 Installation unter Microsoft Windows . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4 Installation unter Mac OS X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.5 Installation unter Ubuntu Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.6 Installation auf anderen Plattformen . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.7 Verwenden der Python-Shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.8 Python-Editoren und -IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2 Ihr erstes Python-Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2 Funktionen deklarieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.1 Pythons Datentypen im Vergleich mit denen anderer Sprachen������������������������������������������������������������ 13 2.3 Lesbaren Code schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3.1 Docstrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4 Der import-Suchpfad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.5 Alles ist ein Objekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.5.1 Was ist ein Objekt? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.6 Code einrücken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.7 Ausnahmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.7.1 Importfehler abfangen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.8 Ungebundene Variablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.9 Groß- und Kleinschreibung bei Namen . . . . . . . . . . . . . . . . . . . . . . . 21 2.10 Skripte ausführen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3 Native Datentypen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.2 Boolesche Werte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.3 Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.3.1 int- in float-Werte umwandeln und anders herum . . . . . . 25 3.3.2 Einfache Rechenoperationen . . . . . . . . . . . . . . . . . . . . . . . . . . 26 xi xii Inhaltsverzeichnis 3.3.3 Brüche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3.4 Trigonometrie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.3.5 Zahlen in einem booleschen Kontext . . . . . . . . . . . . . . . . . . . 28 3.4 Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.4.1 Erstellen einer Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.4.2 Slicing einer Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.4.3 Elemente zu einer Liste hinzufügen . . . . . . . . . . . . . . . . . . . . 31 3.4.4 Innerhalb einer Liste nach Werten suchen . . . . . . . . . . . . . . . 33 3.4.5 Elemente aus einer Liste entfernen . . . . . . . . . . . . . . . . . . . . . 34 3.4.6 Elemente aus einer Liste entfernen: Bonusrunde . . . . . . . . . . 34 3.4.7 Listen in einem booleschen Kontext . . . . . . . . . . . . . . . . . . . . 35 3.5 Tupel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.5.1 Tupel in einem booleschen Kontext . . . . . . . . . . . . . . . . . . . . 38 3.5.2 Mehrere Werte auf einmal zuweisen . . . . . . . . . . . . . . . . . . . . 38 3.6 Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.6.1 Ein Set erstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.6.2 Ein Set verändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.6.3 Elemente aus einem Set entfernen . . . . . . . . . . . . . . . . . . . . . 42 3.6.4 Einfache Mengenoperationen . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.6.5 Sets in einem booleschen Kontext . . . . . . . . . . . . . . . . . . . . . 45 3.7 Dictionarys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.7.1 Erstellen eines Dictionarys . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.7.2 Ein Dictionary verändern . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.7.3 Dictionarys mit gemischten Werten . . . . . . . . . . . . . . . . . . . . 48 3.7.4 Dictionarys in einem booleschen Kontext . . . . . . . . . . . . . . . 49 3.8 None . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.8.1 None in einem booleschen Kontext . . . . . . . . . . . . . . . . . . . . 50 4 Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.2 Mit Dateien und Verzeichnissen arbeiten . . . . . . . . . . . . . . . . . . . . . . 51 4.2.1 Das aktuelle Arbeitsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . 51 4.2.2 Mit Dateinamen und Verzeichnisnamen arbeiten . . . . . . . . . . 52 4.2.3 Verzeichnisse auflisten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 4.2.4 Metadaten von Dateien erhalten . . . . . . . . . . . . . . . . . . . . . . . 55 4.2.5 Absolute Pfadnamen erstellen . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.3 List Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.4 Dictionary Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.4.1 Andere tolle Sachen, die man mit Dictionary Comprehensions machen kann�������������������������������������������������� 60 4.5 Set Comprehensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 5 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.1 Langweiliges Zeug, das Sie wissen müssen, bevor es losgeht . . . . . . 61 5.2 Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 5.3 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Inhaltsverzeichnis xiii 5.4 Strings formatieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 5.4.1 Zusammengesetzte Feldnamen . . . . . . . . . . . . . . . . . . . . . . . 67 5.4.2 Formatmodifizierer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 5.5 Andere häufig verwendete String-Methoden . . . . . . . . . . . . . . . . . . 69 5.5.1 Slicen eines Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 5.6 Strings vs. Bytes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 5.7 Nachbemerkung – Zeichencodierung von Python-Quelltext . . . . . . 75 6 Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 6.2 Fallbeispiel: Adresse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 6.3 Fallbeispiel: römische Zahlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 6.3.1 Prüfen der Tausender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 6.3.2 Prüfen der Hunderter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 6.4 Verwenden der {n,m}-Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 6.4.1 Prüfen der Zehner und Einer . . . . . . . . . . . . . . . . . . . . . . . . . 85 6.5 Ausführliche reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 6.6 Fallbeispiel: Telefonnummern gliedern . . . . . . . . . . . . . . . . . . . . . . 88 6.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 7 Closures und Generatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7.1 Abtauchen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 7.2 Nutzen wir reguläre Ausdrücke! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 7.3 Eine Funktionsliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 7.4 Eine Musterliste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 7.5 Eine Musterdatei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 7.6 Generatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 7.6.1 Ein Fibonacci-Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 7.6.2 Ein Generator für Plural-Regeln . . . . . . . . . . . . . . . . . . . . . . 107 8 Klassen und Iteratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 8.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 8.2 Klassen definieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 8.2.1 Die __init__()-Methode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 8.3 Klassen instanziieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 8.4 Instanzvariablen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 8.5 Ein Fibonacci-Iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 8.6 Ein Iterator für Plural-Regeln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 9 Erweiterte Iteratoren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 9.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 9.2 Alle Vorkommen eines Musters finden . . . . . . . . . . . . . . . . . . . . . . . 123 9.3 Die einmaligen Elemente einer Folge finden . . . . . . . . . . . . . . . . . . 124 9.4 Bedingungen aufstellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 9.5 Generator-Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 9.6 Permutationen berechnen … Auf die faule Art! . . . . . . . . . . . . . . . . 126 xiv Inhaltsverzeichnis 9.7 Anderes cooles Zeug im Modul itertools . . . . . . . . . . . . . . . 128 9.8 Eine neue Art der String-Manipulation . . . . . . . . . . . . . . . . . . . . . 132 9.9 Herausfinden, ob ein beliebiger String ein Python-Ausdruck ist ���������������������������������������������������������������������� 134 9.10 Alles zusammenfügen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 10 Unit Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 10.1 Los geht’s (noch nicht) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 10.2 Eine Frage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 10.3 Anhalten und Alarm schlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 10.4 Wieder anhalten und wieder Alarm . . . . . . . . . . . . . . . . . . . . . . . . 150 10.5 Noch eine Kleinigkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 10.6 Eine erfreuliche Symmetrie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 10.7 Noch mehr schlechte Eingaben . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 11 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 11.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 11.2 Mit sich ändernden Anforderungen umgehen . . . . . . . . . . . . . . . . 166 11.3 Refactoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 11.4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 12 Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 12.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 12.2 Aus Textdateien lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 12.2.1 Die Zeichencodierung zeigt ihre hässliche Fratze . . . . . . 178 12.2.2 Streamobjekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 12.2.3 Daten aus einer Textdatei lesen . . . . . . . . . . . . . . . . . . . . 180 12.2.4 Dateien schließen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 12.2.5 Automatisches Schließen von Dateien . . . . . . . . . . . . . . . 183 12.2.6 Daten zeilenweise lesen . . . . . . . . . . . . . . . . . . . . . . . . . . 184 12.3 In Textdateien schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 12.3.1 Schon wieder Zeichencodierung . . . . . . . . . . . . . . . . . . . 186 12.4 Binärdateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 12.5 Streamobjekte aus anderen Quellen als Dateien . . . . . . . . . . . . . . 188 12.5.1 Umgang mit komprimierten Dateien . . . . . . . . . . . . . . . . 189 12.6 Standardeingabe, -ausgabe und -fehler . . . . . . . . . . . . . . . . . . . . . 191 12.6.1 Die Standardausgabe umleiten . . . . . . . . . . . . . . . . . . . . . 192 13 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 13.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 13.2 Ein XML-Crashkurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 13.3 Der Aufbau eines Atom-Feeds . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 13.4 XML parsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 13.4.1 Elemente sind Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 13.4.2 Attribute sind Dictionarys . . . . . . . . . . . . . . . . . . . . . . . . 203 13.5 Innerhalb eines XML-Dokuments nach Knoten suchen . . . . . . . . 204 Inhaltsverzeichnis xv 13.6 Noch mehr XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 13.7 XML erzeugen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 13.8 Beschädigtes XML parsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 14 Python-Objekte serialisieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 14.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 14.1.1 Eine kurze Bemerkung zu den Beispielen dieses Kapitels ������������������������������������������������������������������ 216 14.2 Daten in einer pickle-Datei speichern . . . . . . . . . . . . . . . . . . . . 216 14.3 Daten aus einer pickle-Datei lesen . . . . . . . . . . . . . . . . . . . . . . 218 14.4 pickle ohne Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 14.5 Bytes und Strings zeigen ein weiteres Mal ihre hässlichen Fratzen �������������������������������������������������������������������������� 220 14.6 pickle-Dateien debuggen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 14.7 Serialisierte Python-Objekte in anderen Sprachen lesbar machen���������������������������������������������������������������������������������� 223 14.8 Daten in einer JSON-Datei speichern . . . . . . . . . . . . . . . . . . . . . . 223 14.9 Entsprechungen der Python-Datentypen in JSON . . . . . . . . . . . . 225 14.10 Von JSON nicht unterstützte Datentypen serialisieren . . . . . . . . . 226 14.11 Daten aus einer JSON-Datei laden . . . . . . . . . . . . . . . . . . . . . . . . 229 15 HTTP-Webdienste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 15.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 15.2 Eigenschaften von HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 15.2.1 Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 15.2.2 Überprüfen des Datums der letzten Änderung . . . . . . . . 236 15.2.3 ETags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 15.2.4 Komprimierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 15.2.5 Weiterleitungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 15.3 Wie man Daten nicht über HTTP abrufen sollte . . . . . . . . . . . . . . 239 15.4 Was geht über’s Netz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 15.5 Vorstellung von httplib2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 15.5.1 Ein kleiner Exkurs zur Erklärung, warum httplib2 Bytes statt Strings zurückgibt�������������������������������������������� 246 15.5.2 Wie httplib2 mit Caching umgeht . . . . . . . . . . . . . . . 247 15.5.3 Wie httplib2 mit Last-Modified- und ETagHeadern umgeht���������������������������������������������������������������� 250 15.5.4 Wie httplib2 mit Komprimierung umgeht . . . . . . . . . . . . 252 15.5.5 Wie httplib2 mit Weiterleitungen umgeht . . . . . . . . . . . . 253 15.6 Über HTTP-GET hinaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 15.7 Über HTTP-POST hinaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 16 Fallstudie: chardet zu Python 3 portieren . . . . . . . . . . . . . . . . . . . . 263 16.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 16.2 Was ist die automatische Zeichencodierungserkennung? . . . . . . . 263 16.2.1 Ist das nicht unmöglich? . . . . . . . . . . . . . . . . . . . . . . . . . 263 16.2.2 Existiert solch ein Algorithmus? . . . . . . . . . . . . . . . . . . . 264 xvi Inhaltsverzeichnis 16.3 Das chardet-Modul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 16.3.1 UTF-n mit einer Byte Order Mark . . . . . . . . . . . . . . . . . . 265 16.3.2 Escape-Codierungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 16.3.3 Multi-Byte-Codierungen . . . . . . . . . . . . . . . . . . . . . . . . . 265 16.3.4 Single-Byte-Codierungen . . . . . . . . . . . . . . . . . . . . . . . . 266 16.3.5 windows-1252 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 16.4 2to3 ausführen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 16.5 Mehr-Dateien-Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 16.6 Anpassen, was 2to3 nicht anpassen kann . . . . . . . . . . . . . . . . . . 272 16.6.1 False ist ungültige Syntax . . . . . . . . . . . . . . . . . . . . . . 272 16.6.2 Kein Modul namens constants . . . . . . . . . . . . . . . . . 273 16.6.3 Bezeichner 'file' ist nicht definiert . . . . . . . . . . . . . . 274 16.6.4 Ein Stringmuster kann nicht auf ein byteartiges Objekt angewandt werden ������������������������������������������������ 274 16.6.5 Implizite Umwandlung eines 'bytes'-Objekts in str nicht möglich ������������������������������������������������������������ 276 16.6.6 Nicht unterstützte Datentypen für Operand +: 'int' und 'bytes' ������������������������������������������������ 278 16.6.7 ord() erwartet String der Länge 1, int gefunden . . . . 280 16.6.8 Unsortierbare Datentypen: int() >= str() . . . . . . 282 16.6.9 Globaler Bezeichner 'reduce' ist nicht definiert . . . . 284 16.7 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 17 Python-Bibliotheken packen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 17.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 17.2 Was kann Distutils nicht für Sie tun? . . . . . . . . . . . . . . . . . . . . . . 288 17.3 Verzeichnisstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 17.4 Das Setup-Skript schreiben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 17.5 Ihr Paket klassifizieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 17.5.1 Beispiele guter Paket-Klassifizierer . . . . . . . . . . . . . . . . . 293 17.6 Zusätzliche Dateien mit einem Manifest angeben . . . . . . . . . . . . 294 17.7 Ihr Setup-Skript auf Fehler untersuchen . . . . . . . . . . . . . . . . . . . . 295 17.8 Eine Quellcode-Distribution erstellen . . . . . . . . . . . . . . . . . . . . . . 296 17.9 Einen grafischen Installer erstellen . . . . . . . . . . . . . . . . . . . . . . . . 298 17.9.1 Installierbare Pakete für andere Betriebssysteme erzeugen ���������������������������������������������������������������������������� 299 17.10 Ihre Software zum Python Package Index hinzufügen . . . . . . . . . 299 17.11 Die Zukunft des Packens von Python-Software . . . . . . . . . . . . . . 301 Anhang A – Code mithilfe von 2to3 von Python 2 zu Python 3 portieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 A.1 Los geht’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 A.2 print-Anweisung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 A.3 Unicode-Stringliterale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304 A.4 Globale unicode()-Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . 304