Freigabe der Schicht , die vollständigen Zugriff auf die Java-Klassenbibliotheken für Python-Anwendungen ermöglicht. Mit JPype können spezifische Java-Bibliotheken aus Python verwendet werden, wodurch hybride Anwendungen geschaffen werden, die Java- und Python-Code 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. Der vorgeschlagene 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.
Hauptänderungen:
- Ausnahmen, die im C++- und Java-Code ausgelöst werden, liefern jetzt einen Stack-Trace, wenn eine Ausnahme im Python-Code auftritt. Um Informationen über den Stack-Trace zu erhalten, ist es daher nicht mehr nötig, stacktrace() aufzurufen.
- Die Rückgabegeschwindigkeit bei Aufrufen wurde um das Dreifache erhöht.
- Die Übertragungsgeschwindigkeit wurde erheblich (um Größenordnungen) erhöht
für numpy-Puffer mehrdimensionaler Arrays. Mehrdimensionale Primitive geben schreibgeschützte Kopien zurück, 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 den jpype-Klassentypen abgeleitet sind, wurde ein dedizierter Java-Slot hinzugefügt. Alle privaten Tabellen wurden nach CPython verschoben. Java-Typen müssen jetzt von der Metaklasse JClass erben, die Typ-Slots verwendet. Mixins für die Basisklassen von Python sind nicht zulässig. Die Typen Object, Proxy, Exception, Number und Array erben direkt von den internen Implementierungen von CPython. - Das Tracing und die Behandlung von Ausnahmen wurden verbessert.
- Array-Slices werden jetzt als Ansichten behandelt, die das Zurückschreiben in das Original unterstützen, wie z.B. numpy-Arrays. Für Array-Slices wurde die Unterstützung für das Setzen und Abrufen von Werten mit Schritten (slice(start, stop, step)) sichergestellt.
- In Arrays wurde die Unterstützung für „__reversed__“ implementiert.
- In Java-Arrays wurde die Unterstützung für die API memoryview sichergestellt, und die Abhängigkeit von numpy für die Übertragung des Puffers wurde entfernt.
- Numpy ist jetzt keine Abhängigkeit (extra) mehr, und die Speicherübertragung in numpy ist ohne Kompilierung mit Numpy-Unterstützung verfügbar.
- JInterface wurde als Metaklasse gestaltet. Verwenden Sie isinstance(cls, JInterface), um auf Schnittstellen zu prüfen.
- Es wurden die fehlenden TLDs „mil“, „net“ und „edu“ zu den Standard-Importen hinzugefügt.
- Beim Start wurden die Fehlermeldungen für UnsupportedClassVersion verbessert.
- java.util.Map gibt jetzt einen KeyError zurück, 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 sollen.
- java.util.Collection wurde entfernt, da es seltsam zwischen remove(Object) und remove(int) bei Listen überladen wird. 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-Ausnahme behandelt werden, wenn auf Elemente von java.util.List zugegriffen wird.
Quelle: opennet.ru
