Effektiv Python programmieren
90 Wege für bessere Python-Programme
Brett Slatkin
Cite this publication as
Brett Slatkin, Effektiv Python programmieren (2020), mitp-Verlag, Frechen, ISBN: 9783747501771
6584
accesses
accesses
5
quotes
quotes
Descripción
Brett Slatkin ist als Senior Software Engineer bei Google tätig und zudem leitender Ingenieur und Mitbegründer des Projekts . Zuvor hat er an der Python-Infrastruktur von mitgewirkt. Außerdem nutzte er Python zur Verwaltung von Googles riesigem Serverbestand und für dessen PubSubHubbub-System, an dessen Protokoll er ebenfalls mitgearbeitet hat.
Descripción / Abstract
Índice
- Cover
- Titel
- Impressum
- Inhaltsverzeichnis
- Einleitung
- Über den Autor
- Danksagungen
- Kapitel 1: Pythons Sicht der Dinge
- Punkt 1: Kenntnis der Python-Version
- Punkt 2: Stilregeln gemäß PEP 8
- Punkt 3: Unterschiede zwischen bytes und str
- Punkt 4: Interpolierte F-Strings statt C-Formatierungsstrings und str.format
- Punkt 5: Hilfsfunktionen statt komplizierter Ausdrücke
- Punkt 6: Mehrfachzuweisung beim Entpacken statt Indizierung
- Punkt 7: enumerate statt range
- Punkt 8: Gleichzeitige Verarbeitung von Iteratoren mit zip
- Punkt 9: Verzicht auf else-Blöcke nach for- und while-Schleifen
- Punkt 10: Wiederholungen verhindern durch Zuweisungsausdrücke
- Kapitel 2: Listen und Dictionaries
- Punkt 11: Zugriff auf Listen durch Slicing
- Punkt 12: Verzicht auf Abstand und Start-/Ende-Index in einem einzigen Ausdruck
- Punkt 13: Vollständiges Entpacken statt Slicing
- Punkt 14: Sortieren nach komplexen Kriterien mit dem key-Parameter
- Punkt 15: Vorsicht bei der Reihenfolge von dict-Einträgen
- Punkt 16: get statt in und KeyError zur Handhabung fehlender Dictionary-Schlüssel verwenden
- Punkt 17: defaultdict statt setdefault zur Handhabung fehlender Objekte verwenden
- Punkt 18: Schlüsselabhängige Standardwerte mit __missing__ erzeugen
- Kapitel 3: Funktionen
- Punkt 19: Bei Funktionen mit mehreren Rückgabewerten nicht mehr als drei Variablen entpacken
- Punkt 20: Exceptions statt Rückgabe von None
- Punkt 21: Closures und der Gültigkeitsbereich von Variablen
- Punkt 22: Klare Struktur dank variabler Anzahl von Positionsargumenten
- Punkt 23: Optionale Funktionalität durch Schlüsselwort- Argumente
- Punkt 24: Dynamische Standardwerte von Argumenten mittels None und Docstrings
- Punkt 25: Eindeutigkeit durch reine Schlüsselwort- und reine Positionsargumente
- Punkt 26: Funktions-Decorators mit functools.wraps definieren
- Kapitel 4: Listen-Abstraktionen und Generatoren
- Punkt 27: Listen-Abstraktionen statt map und filter
- Punkt 28: Nicht mehr als zwei Ausdrücke in Listen-Abstraktionen
- Punkt 29: Doppelte Arbeit in Abstraktionen durch Zuweisungsausdrücke vermeiden
- Punkt 30: Generatoren statt Rückgabe von Listen
- Punkt 31: Vorsicht beim Iterieren über Argumente
- Punkt 32: Generatorausdrücke für umfangreiche Listen-Abstraktionen verwenden
- Punkt 33: Mehrere Generatoren mit yield from verknüpfen
- Punkt 34: Keine Datenübermittlung an Generatoren mit send
- Punkt 35: Zustandsübergänge in Generatoren mit throw vermeiden
- Punkt 36: Iteratoren und Generatoren mit itertools verwenden
- Kapitel 5: Klassen und Schnittstellen
- Punkt 37: Klassen statt integrierte Datentypen verschachteln
- Punkt 38: Funktionen statt Klassen bei einfachen Schnittstellen
- Punkt 39: Polymorphismus und generische Erzeugung von Objekten
- Punkt 40: Initialisierung von Basisklassen durch super
- Punkt 41: Verknüpfte Funktionalität mit Mix-in-Klassen
- Punkt 42: Öffentliche statt private Attribute
- Punkt 43: Benutzerdefinierte Container-Klassen durch Erben von collections.abc
- Kapitel 6: Metaklassen und Attribute
- Punkt 44: Einfache Attribute statt Getter- und Setter-Methoden
- Punkt 45: @property statt Refactoring von Attributen
- Punkt 46: Deskriptoren für wiederverwendbare @property-Methoden verwenden
- Punkt 47: Verzögerte Zuweisung zu Attributen mittels __getattr__, __getattribute__ und __setattr__
- Punkt 48: Unterklassen mit __init_subclass__ überprüfen
- Punkt 49: Klassen mittels __init_subclass__ registrieren
- Punkt 50: Zugriff auf Klassenattribute mit __set_name__
- Punkt 51: Klassen-Decorators statt Metaklassen für Klassenerweiterungen nutzen
- Kapitel 7: Nebenläufigkeit und parallele Ausführung
- Punkt 52: Verwaltung von Kindprozessen mittels subprocess
- Punkt 53: Threads, blockierende Ein-/Ausgabevorgänge und parallele Ausführung
- Punkt 54: Wettlaufsituationen in Threads mit Lock verhindern
- Punkt 55: Threads koordinieren mit Queue
- Punkt 56: Erkennen, wann parallele Ausführung erforderlich ist
- Punkt 57: Keine neuen Thread-Instanzen beim Fan-Out
- Punkt 58: Die Verwendung von Queue zur parallelen Ausführung erfordert Refactoring
- Punkt 59: ThreadPoolExecutor zur parallelen Ausführung verwenden
- Punkt 60: Parallele Ausführung mehrerer Funktionen mit Coroutinen
- Punkt 61: asyncio statt threaded I/O
- Punkt 62: Threads und Coroutinen verwenden, um die Umstellung auf asyncio zu erleichtern
- Punkt 63: asyncio-Event-Loop nicht blockieren
- Punkt 64: Echte parallele Ausführung mit concurrent.futures
- Kapitel 8: Robustheit und Performance
- Punkt 65: Alle Blöcke einer try/except/else/finally- Anweisung nutzen
- Punkt 66: contextlib und with-Anweisung für wiederverwendbares try/finally-Verhalten verwenden
- Punkt 67: Für örtliche Zeitangaben datetime statt time verwenden
- Punkt 68: Verlässliches pickle durch copyreg
- Punkt 69: Falls Genauigkeit an erster Stelle steht, decimal verwenden
- Punkt 70: Vor der Optimierung Messungen vornehmen
- Punkt 71: deque für Erzeuger-Verbraucher-Warteschlangen verwenden
- Punkt 72: Durchsuchen von Sequenzen geordneter Elemente mit bisect
- Punkt 73: heapq für Prioritätswarteschlangen verwenden
- Punkt 74: memoryview und bytearray für Zero-Copy- Interaktionen mit bytes verwenden
- Kapitel 9: Testen und Debuggen
- Punkt 75: Debuggen mit repr-Strings
- Punkt 76: Ähnliches Verhalten mit TestCase-Unterklassen überprüfen
- Punkt 77: Tests mit setUp, tearDown, setUpModule und tearDownModule voneinander abschotten
- Punkt 78: Mocks für Tests von Code mit komplexen Abhängigkeiten verwenden
- Punkt 79: Abhängigkeiten kapseln, um das Erstellen von Mocks und Tests zu erleichtern
- Punkt 80: Interaktives Debuggen mit pdb
- Punkt 81: Nutzung des Arbeitsspeichers und Speicherlecks mit tracemalloc untersuchen
- Kapitel 10: Zusammenarbeit
- Punkt 82: Module der Python-Community
- Punkt 83: Virtuelle Umgebungen zum Testen von Abhängigkeiten
- Punkt 84: Docstrings für sämtliche Funktionen, Klassen und Module
- Punkt 85: Pakete zur Organisation von Modulen und zur Bereitstellung stabiler APIs verwenden
- Punkt 86: Modulweiter Code zur Konfiguration der Deployment-Umgebung
- Punkt 87: Einrichten einer Root-Exception zur Abschottung von Aufrufern und APIs
- Punkt 88: Zirkuläre Abhängigkeiten auflösen
- Punkt 89: warnings für Refactoring und Migration verwenden
- Punkt 90: Statische Analyse mit typing zum Vermeiden von Bugs
- Stichwortverzeichnis