Skip to main content

IronPython im Vergleich zu cPython

Es gibt einige kleine Unterschiede und Inkompatibilitäten zwischen IronPython und „Standard“-Python (aka cPython). Einige sind klare Fehler in IronPython und sollten in künftigen Versionen behoben sein. Andere jedoch werden als „Implementierungsdetails“ betrachtet und werden bestehen bleiben. Bei manchen davon handelt es sich um sehr anspruchvolle Themen.

Der größte für den Anwender ersichtliche Unterschied ist wohl die Handhabung von Strings. Original-cPython hat zwei verschiedene Stringtypen für „byte-strings“ und „Unicode-strings“. Dieses Konzept ist ähnlich dem der Datentypen STRING und WSTRING in IEC. IronPython verwendet einfach .NET-Strings, die immer Unicode-fähig sind und intern UTF-16 verwenden. Allerdings implementiert IronPython einen Trick, um den Unterschied zu cPython vor dem Programmierer zu verbergen. (Interessant: Für die neue Python Version 3 überarbeiteten die Entwickler ihr String-Handling komplett. Es entstand ein Modell, das viel näher an dem von IronPython liegt. Es werden danach immer Unicode-Strings verwendet und es gibt einen eigenen Datentyp für die Handhabung von Rohbytes.)

Python-Module, die in C geschrieben sind, können nicht in IronPython importiert werden, weil cPython komplett andere interne Datenstrukturen verwendet als IronPython. Die meisten Standardbibliotheksmodule wurde in IronPython neu implementiert, aber manche Module (wie die TK-Schnittstelle) sind nicht verfügbar, solange sie nicht jemand explizit nach IronPython portiert. Andererseits bietet IronPython Zugriff auf .NET-Assemblies inklusive des .NET-Frameworks (wie oben gezeigt), was das Fehlen dieses Features mehr als kompensiert.

Während cPython Referenzzählung und einen deterministischen Garbage Collector verwendet, um zyklischen Müll einzusammeln, verläßt sich IronPython auf den nicht-deterministischen .NET Garbage Collector. In den meisten Fällen spielt dieser Unterschied keine Rolle. Wenn Sie aber Dateien oder andere Ressourcen über die Python Standardbibliothek oder des .NET-Frameworks öffnen, sollten Sie darauf achten, diese auch wieder zu schließen. Am besten verwenden Sie dazu die with-Anweisung mit Python Context Managers oder .NET IDisposable-Instanzen.

Für weitere Informationen siehe: Content Managers und .NET IDisposable