Портирование библиотеки с Java на Python - PullRequest
6 голосов
/ 15 января 2009

Я собираюсь портировать небольшую библиотеку с Java на Python и хотел получить несколько советов (небольшая ~ несколько тысяч строк кода). Я немного изучил код Java и заметил некоторые шаблоны проектирования, которые являются общими для обоих языков. Тем не менее, определенно присутствовали некоторые идиомы только для Java (синглтоны и т. Д.), Которые обычно плохо воспринимаются в мире Python.

Я знаю, что существует как минимум один инструмент (j2py), который превратит файл .java в файл .py, пройдя AST. Некоторые первоначальные эксперименты дали менее чем положительные результаты.

Должен ли я даже подумать об использовании автоматизированного инструмента для генерации некоторого кода, или языки настолько различны, что любой инструмент создаст достаточно переработок, чтобы оправдать написание с нуля?

Если инструменты не являются дьяволом, есть ли какие-либо кроме j2py, которые могут по крайней мере обрабатывать управление импортом того же проекта? Я не ожидаю, что какой-либо инструмент сопоставит сторонние библиотеки с одного языка на другой.

Ответы [ 7 ]

9 голосов
/ 15 января 2009

Если бы это был я, я бы подумал сделать работу вручную. Несколько тысяч строк кода - это не много кода, и, переписав его самостоятельно (вместо того, чтобы переводить его автоматически), вы сможете решить, как правильно использовать идиомы Python. (FWIW, я работал на Java почти исключительно в течение 9 лет, и сейчас я работаю на Python, поэтому я знаю, какой перевод вам придется делать.)

6 голосов
/ 15 января 2009

Код всегда лучше во второй раз, когда вы пишете его в любом случае .... Плюс несколько тысяч строк Java, вероятно, могут быть переведены в несколько сотен Python.

5 голосов
/ 15 января 2009

Посмотрите на Jython . Он может довольно легко интегрировать Python поверх Java и предоставлять доступ к библиотекам Java, но все же позволяет вам динамически работать с ними.

3 голосов
/ 15 января 2009

Я бы написал это снова от руки. Я не знаю каких-либо автоматических инструментов, которые бы генерировали не вызывающий отвращения внешний вид Python, и, перенеся сам Java-код на Python, я обнаружил, что результат был и выше, чем в оригинале, и значительно короче.

Вы получаете качество, потому что Python более выразителен (например, анонимный внутренний класс MouseAdapters и т. П. Уходит в пользу простых функций первого класса), и вы также получаете преимущество от написания его во второй раз.

Это также значительно короче: например, 99% получателей / установщиков могут быть просто опущены в пользу прямого доступа к полям. Для других 1%, которые действительно что-то делают, вы можете использовать property().

Однако, как сказал Дэвид, если вам не нужно ни читать, ни поддерживать код, автоматический переводчик подойдет.

3 голосов
/ 15 января 2009

Автоматические переводчики (f2c, j2py и т. Д.) Обычно генерируют код, к которому вы не хотите прикасаться вручную. Это нормально, когда все, что вам нужно сделать, это использовать вывод (например, если у вас есть компилятор C и нет компилятора Fortran, f2c позволяет вам компилировать программы на Fortran), но это ужасно, когда вам нужно что-то делать с кодом впоследствии. Если вы намерены использовать это как что-либо кроме черного ящика, переведите его вручную. При таком размере это не будет слишком сложно.

2 голосов
/ 15 января 2009

Jython - это не то, что вам нужно в конечном решении, но сделает намного более плавным перенос.

Мой подход был бы:

  1. Если существуют существующие тесты (модульные или иные), переписать их в Jython (используя юнит-тест Python)
  2. Напишите некоторые тесты характеристик в Jython (тесты, которые записывают текущее поведение)
  3. Начать портирование класса по классу:
    • Для каждого класса подкласс его в Jython и портирование методов один за другим, что делает метод в суперклассе абстрактным
    • После каждого изменения запускает тесты !
  4. Теперь у вас будет рабочий код Jython, который, как мы надеемся, имеет минимальные зависимости от Java.
  5. Запустите тесты в CPython и исправьте все, что осталось.
  6. Refactor - вы захотите Pythonify кода, возможно, сильно упростив его с помощью идиом Python. Это безопасно и легко благодаря тестам.

Я имел это в прошлом с большим успехом.

0 голосов
/ 30 апреля 2010

Я использовал Java2Python. Это не так уж плохо, вам все равно нужно понимать код, поскольку он не делает все правильно, но это помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...