Layer-Release , das es ermöglicht, vollständigen Zugriff von Python-Anwendungen auf Klassenbibliotheken in Java zu organisieren. Mit JPype können spezifische Java-Bibliotheken aus Python verwendet werden, um hybride Anwendungen zu erstellen, die Code in Java und Python kombinieren. Im Gegensatz zu Jython wird die Integration mit Java nicht durch die Erstellung einer Python-Variante für die JVM erreicht, sondern durch die Interaktion auf der Ebene beider virtueller Maschinen unter Verwendung von gemeinsamem Speicher. Dieser Ansatz ermöglicht nicht nur eine gute Leistung, sondern bietet auch Zugang zu allen CPython- und Java-Bibliotheken. Der Code des Projekts unter der Apache 2.0-Lizenz.
Wesentliche Änderungen:
- Ausnahmen, die im C++- und Java-Code ausgelöst werden, bieten jetzt einen Ausnahme-Stacktrace, wenn eine Ausnahme im Python-Code auftritt. Somit ist es nicht mehr erforderlich, stacktrace() aufzurufen, um Informationen über den Ausnahme-Stack zu erhalten.
- Die Rückgabegeschwindigkeit bei Aufrufen wurde verdreifacht.
- Die Übertragungsgeschwindigkeit in
numpy-Puffern mehrdimensionaler Arrays wurde erheblich (um ein Vielfaches) erhöht. Mehrdimensionale Primitiven übertragen nur lesbare Kopien, die innerhalb der JVM mit fortlaufender C-Anordnung erstellt wurden. - Alle internen Komponenten wurden durch Implementierungen aus CPython ersetzt, und die Symbole __javaclass__, __javavalue__ und __javaproxy__
wurden entfernt. Allen CPython-Typen, die von jpype-Klassentypen abgeleitet sind, wurde ein dedizierter Java-Slot hinzugefügt. Alle privaten Tabellen wurden nach CPython übertragen. Java-Typen müssen jetzt von der Metaklasse JClass abgeleitet werden, die Typ-Slots verwendet. Mixins für Basisklassen in Python sind nicht zulässig. Die Typen Object, Proxy, Exception, Number und Array erben direkt von den internen Implementierungen von CPython. - Die Nachverfolgung und Verarbeitung von Ausnahmen wurde verbessert.
- Array-Slices werden jetzt als Ansichten verarbeitet, die das Zurückschreiben in das Original, wie das numpy-Array, unterstützen. Für Array-Slices ist die Unterstützung zum Setzen und Abrufen von Werten mit einem Schritt (slice(start, stop, step)) gewährleistet.
- Die Unterstützung für «__reversed__» wurde in Arrays implementiert.
- In Java-Arrays wurde die Unterstützung für die API memoryview hinzugefügt und die Abhängigkeit von numpy zur Übertragung des Inhalts des Puffers entfernt.
- Numpy ist jetzt keine Abhängigkeit mehr (extra), und die Speicherübertragung in numpy ist ohne Kompilierung mit Unterstützung für numpy verfügbar.
- JInterface wurde als Metaklasse gestaltet. Verwenden Sie isinstance(cls, JInterface), um auf Schnittstellen zu überprüfen.
- Die fehlenden TLDs «mil», «net» und «edu» wurden zu den Standard-Importen hinzugefügt.
- Beim Start wurden die Fehlermeldungen für UnsupportedClassVersion verbessert.
- java.util.Map gibt jetzt einen KeyError aus, wenn ein Element nicht gefunden wird. Werte, die null sind, geben weiterhin None zurück, wie erwartet. Verwenden Sie get(), wenn leere Schlüssel als None behandelt werden müssen.
- Die java.util.Collection wurde entfernt, da sie zwischen remove(Object) und remove(int) auf Listen seltsam überladen ist. Verwenden Sie die Java-Methode remove(), um auf das ursprüngliche Java-Verhalten zuzugreifen, aber Typumwandlung wird dringend empfohlen, um die Überladung zu steuern.
- java.lang.IndexOutOfBoundsException kann jetzt mit der IndexError-Exzeptionsklasse beim Zugriff auf Elemente von java.util.List abgerufen werden.
Quelle: opennet.ru
