Die Tage sind gezählt: End of Life für Python 2

Seite 3: Notwendige Aufräumarbeiten

Inhaltsverzeichnis

Python 3 bringt nicht nur neue Feature mit, sondern räumt zusätzlich mit Altlassen von Python 2 auf. Die Bereinigungen betreffen Bibliotheken, die

  • entfernt wurden,
  • gemäß dem Python Style Guide klein geschrieben werden,
  • neu in Pakete verpackt wurden oder
  • in einer C- und einer Python-Implementierung koexistieren.

Das bekannte Python-Idiom, erst die schnelle C-Implementierung eines Moduls zu importieren und im Fehlerfall auf die Python-Implementierung zurückzugreifen, ist nicht mehr notwendig. Python kümmert sich automatisch darum.

try:
import cPickle as pickle
except ImportError:
import pickle

Genaueres zu den Änderungen der Standardbibliothek ist in einer Übersicht zu den Neuerungen zu finden.

Es gibt weitere Punkte, die das Schreiben von Code in Python 3 vereinfachen. Entwickler müssen bei kooperativen super-Aufrufen nicht mehr die Instanz der Klasse und den Klassennamen nennen. Python 3 kennt nur New-Style-Klassen, sodass das lästige Ableiten von object nicht mehr notwendig ist, um die neueren Features von Python anzusprechen.

Das automatische Evaluieren der Eingabe mit dem Befehl input() ist überflüssig, da die Eingabe in Python 3 als String zur Verfügung steht. Damit hat sich ein großes Sicherheitsloch in Python geschlossen. Konsequenterweise heißt raw_input() nun input().

Sinn und Zweck von Python 2.7 ist es, den Umstieg auf die Version 3 zu vereinfachen. Daher hat das Projekt viele Features von Python 3.0 auf Python 2.7 zurückportiert.

Der Kontext-Manager mit with ist ein wichtiges neues Feature, das mit Python 2.6 zur Verfügung steht. Eine Ressource wie eine Datei, ein Socket oder ein Mutex bindet Python automatisch beim Eintritt in den with-Block und gibt sie beim Austritt wieder frei. C++-Programmierer mag das Idiom an Resource Acquisition Is Initialization (RAII) erinnern.

Das with-Statement verhält sich aus Anwendersicht wie ein try ... finally, da sowohl der try-Block als auch der finally-Block immer zur Ausführung kommen. Allerdings geschieht das ohne explizite Ausnahmebehandlung.

In einem with-Block lässt sich jedes Objekt verwenden, das das Kontextmanagementprotokoll anbietet und damit die internen Methoden __enter()__ und __exit()__ besitzt. Beim Eintritt in den with-Block ruft Python die __enter()__- und beim Austritt _exit()__-Methode auf. Das Dateiobjekt bringt die passenden Methoden von Haus aus mit.

Ressourcen-Management lässt sich zudem eigenhändig durch die Methoden __enter()__ und __exit()__ implementieren. Wem das manuelle Schreiben zu viel Arbeit ist, kann den Decorator contextmanager aus der Bibliothek contextlib verwenden, um vom Kontextmanagement zu profitieren. Weitere Anwendungsfälle sind im Python Enhancement Proposal (PEP) 0343 zu finden.

with open('/etc/passwd', 'r') as file:
for line in file:
print line,
# file is automatically closed

Die wohl größte syntaktische Erweiterung vollzieht sich in Python 2.6 mit der Einführung von abstrakten Basisklassen. Ob ein Objekt sich in einem Kontext verwenden lässt, hing bisher von den Merkmalen des Objekts ab und nicht von dessen formaler Schnittstellenspezifikation.

Das Idiom trägt den Namen Duck-Typing – frei nach dem Gedicht von James Whitcomb Riley: "When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck".

Sobald eine Klasse eine abstrakte Methode besitzt, wird sie zur abstrakten Basisklasse und lässt sich nicht instanziieren. Von ihr abgeleitete Klassen lassen sich nur erzeugen, wenn sie die abstrakten Methoden implementieren. Abstrakte Basisklassen in Python verhalten sich ähnlich wie in C++, insbesondere dürfen abstrakte Methoden eine Implementierung enthalten.

Daneben kennt Python auch abstrakte Properties. Python 3 verwendet abstrakte Basisklassen in den Modulen numbers und collections.

Es steht noch die Antwort auf die Frage aus, wie eine Klasse zur abstrakten Klasse wird: Sie benötigt die Metaklasse ABCMeta. Daraufhin lassen sich die Methoden als @abstractmethod beziehungsweise Properties als @abstractproperty mit den jeweiligen Decorators deklarieren. Der Einsatz abstrakter Basisklassen bedeutet darüber hinaus, dass in die dynamisch typisierende Sprache die statische Typisierung einzieht.

In dem Beispiel lässt sich die Klasse Cygnus nicht instanziieren, da es die abstrakte Methode quack() nicht implementiert (Abb. 5).

Pythons Antwort auf Multiprozessor-Architekturen ist die neue Bibliothek multiprocessing. Sie imitiert das bekannte Python-Modul threading, erzeugt jedoch statt eines Thread einen Prozess – und zwar plattformunabhängig. Das Multiprocessing-Modul war notwendig, da in der Standardimplementierung CPython nur ein Thread im Interpreter laufen kann. Geschuldet ist das Verhalten dem sogenannten Global Interpreter Lock (GIL).