Релиз JPype 1.0, библиотеки для доступа к Java-классам из Python


Доступен релиз прослойки JPype 1.0, позволяющей организовать полный доступ Python-приложений к библиотекам классов на языке Java. При помощи JPype из Python можно использовать специфичные для Java библиотеки, создавая гибридные приложения, сочетающие код на Java и Python. В отличие от Jython, интеграция с Java достигается не через создание варианта Python для JVM, а через взаимодействие на уровне обеих виртуальных машин, используя разделяемую память. Предложенный подход позволяет не только добиться хорошей производительности, но и предоставляет доступ ко всем библиотекам CPython и Java. Код проекта распространяется под лицензией Apache 2.0.

Основные изменения:

  • JChar поддерживается как возвращаемый тип. Для совместимости JChar унаследован от "str" и реализует неявное преобразование в "int". Поэтому он проходит проверки в контрактах. Но это значит, что он больше не считается числовым типом в Python и поэтому isinstance(c, int) принимает значение False, что согласуется с правилами преобразования типов Java.
  • Введён оператор для приведения Java-типа Type@obj (@ - это оператор Python для внутреннего произведения, в Java его нет).
  • Добавлена нотация для создания массивов Java. Type\[s1\]\[s2\]\[s3\] для массивов фиксированных размеров, Type\[:\]\[:\]\[:\] для массивов, которые будут созданы позже.
  • @FunctionalInterface позволяет создавать Java-функторы из Python-объектов с \\call\\.
  • Удалены устаревшие JIterator, использование JException как фабрики, get\_default\_jvm\_path и jpype.reflect.
  • По-умолчанию не происходит конвертация Java-строк в строки Python.
  • Python объявил нерекомендуемым "\\int\\", поэтому неявные приведения между целочисленными и с плавающей точкой типами будут производить TypeError.
  • Объявлено устаревшим использование JException. Чтобы поймать все исключения, или проверить, что объект является типом исключения Java, следует java.lang.Throwable.
  • Каскадные причины Java-исключений теперь отражаются в кадрах стека Python.
  • Объявлено устаревшим использование JString. Чтобы создать Java-строку, или проверить, что объект имеет тип Java-строки, используйте java.lang.String.
  • В Java-классах обновлены repr-методы.
  • java.util.List выполняет контракты для collections.abc.Sequence и collections.abc.MutableSequence.
  • java.util.Collection выполняет контракт for collections.abc.Collection.
  • Java-классы закрыты и будут бросать TypeError при расширении из Python.
  • Обработка Control-C аккуратно. Предыдущие версии падают когда Java обрабатывает Control-C сигнал, так как они завершат Java во время вызова. Теперь JPype создаст InterruptedException, когда будет возвращаться из Java. Control-C не выкинет из больших Java-процедур, как сейчас реализовано, так как Java не имеет специального средства для этого.

Следом сформирован корректирующий выпуск 1.0.1, в котором добавлены изменения для обхода проблем с релизом Python 3.8.4. Python изменил логику относительно использования "\\setattr\\_" для "object" и "type", предотвращая её использование для изменения порождённых классов. Ещё проверка на ошибки была делегирована из метода "\\_setattr\\", поэтому типы исключений в некоторых проверках на адекватность должны быть обновлены соответствующе.

Источник: https://www.opennet.ru/opennews/art.shtml?num=53382


Comments 0