Cómo convertir Python a JavaScript (y viceversa)

¿Python o JavaScript? Si bien todavía estamos discutiendo sobre quién tiene la ventaja o el futuro más brillante, existen pocas dudas sobre quién es el propietario de la interfaz web. Es JavaScript en el navegador o nada.

Bueno, quizás no  nada.  JavaScript es un lenguaje de destino favorito para los "transpilers" que convierten un lenguaje de programación en otro (ver: TypeScript, Emscripten, Cheerp, Cor). Y el gran número de seguidores y la riqueza de bibliotecas disponibles de Python lo convierten en un gran candidato para ser convertido, es decir, transpilado, en JavaScript.

Aquí hay cuatro proyectos actuales para hacer que Python sea útil en el mundo de JavaScript. Se destaca por poder convertir en ambas direcciones.

Brython

Una de las promesas que hace WebAssembly es permitirnos usar cualquier lenguaje que elijamos desarrollar para la web, aunque esto sigue siendo un objetivo lejano. La filosofía detrás de Brython, al menos en lo que respecta a Python 3, es ¿por qué esperar?

Brython implementa una versión de Python 3 para la programación web del lado del cliente a través de una biblioteca de JavaScript que emula todas las palabras clave y la mayoría de las funciones integradas de Python 3. Los scripts escritos en Python se pueden incluir directamente en una página web. Brython proporciona una interfaz de módulo Python de alto nivel (el  browser paquete) para interactuar con el DOM y el navegador, es decir, para manejar todo el trabajo que normalmente se realiza directamente en JavaScript.

Muchos ejemplos de código en vivo y una galería de miniaplicaciones demuestran cómo funciona todo. Incluso es posible usar Brython para escribir una aplicación nativa de Android en Python. La funcionalidad asincrónica está disponible, aunque debe usar el asyncmódulo de Brython en lugar del de Python asyncio.

Brython no escapa a las restricciones impuestas a JavaScript en el navegador. Por ejemplo, no hay soporte para tratar con el sistema de archivos local. Sin embargo, existe soporte para el uso de almacenamiento local HTML5, si todo lo que necesita es alguna forma de conservar los datos por aplicación.

JavaScripthon

JavaScripthon se enfoca estrictamente en traducir Python 3.5 y código posterior a JavaScript, sin intentar brindar soporte completo en el navegador según proyectos como Brython. Emite código ES6 para minimizar la necesidad de polyfills en el navegador y funciona bien con herramientas como Webpack al preservar los mapas de origen.

Se admiten la mayoría de las palabras clave y los comportamientos comunes de Python, incluidos asyncy await, las cadenas f de Python 3.6 y los métodos y herencias de clases de Python. También puede insertar JavaScript en línea mediante una llamada de función especial, si alguna vez necesita acceder directamente a JavaScript.

Tenga en cuenta que las últimas confirmaciones con el proyecto JavaScripthon fueron en mayo de 2018, por lo que no ha recibido soporte para las últimas funciones de Python, como el "operador de morsa". Pero cualquiera que use las funciones de Python 3.6 debería tener un buen soporte.

[También en: 24 bibliotecas de Python para cada desarrollador de Python]

Jiphy

El nombre Jiphy es una abreviatura de "JavaScript in, Python out". En otras palabras, Jiphy convierte en ambas direcciones entre los dos idiomas. Además, el código de ambos idiomas se puede mezclar antes de convertirlo a cualquiera de los idiomas de destino.

Antes de sumergirse y comenzar a convertir todo OpenStack a JavaScript, tenga en cuenta: Jiphy no se trata de una conversión de base de código en toda regla. Más bien, su función es, como dice el README, "reducir el cambio de contexto necesario para que un desarrollador de Python escriba código JavaScript y viceversa".

El mayor inconveniente de Jiphy es que solo admite un subconjunto de las características de Python. No hay clases ni argumentos predeterminados disponibles, aunque se admiten decoradores y excepciones. Gran parte de esto se debe a que Jiphy se esfuerza por lograr una relación línea a línea entre el código fuente y el de destino, pero sus desarrolladores han observado las nuevas funciones de ES6 para obtener una compatibilidad más avanzada con las funciones de Python.

Tenga en cuenta que el proyecto Jiphy no se ha actualizado desde finales de 2017. Jiphy debe considerarse estrictamente experimental hasta que se reanude el trabajo.

JS2Py

JS2Py convierte JavaScript a Python, como su nombre lo indica, utilizando un motor de conversión de Python puro. Tiene soporte oficial solo para ES5 en este momento, aunque hay soporte ES6 experimental para valientes y audaces.

JS2Py admite una gran cantidad de interoperación cruzada entre Python y JavaScript. Puede importar módulos Node.js existentes en su código Python, mediante un js2py.requiremétodo. Las variables del lado de JavaScript se pueden evaluar en el lado de Python, y los objetos de Python también se pueden usar desde el código JavaScript.

JS2Py también incluye una máquina virtual altamente experimental que evalúa el código JavaScript de Python, pero aún no se recomienda para uso en producción.

RapydScript

RapydScript promete "JavaScript Pythonic que no apesta". El proyecto es similar a CoffeeScript en el sentido de que ingiere código escrito en un lenguaje alternativo, en este caso, un sabor de Python, y genera JavaScript que puede ejecutarse en cualquier lugar como está. 

Por lo tanto, RapydScript proporciona lo mejor de ambos mundos, llevando la sintaxis limpia de Python a las capacidades de JavaScript como funciones anónimas, manipulación de DOM y la capacidad de aprovechar las bibliotecas de JavaScript como jQuery o el núcleo de Node.js. Así es, puede usar código generado por Rapydscript para impulsar páginas web o aplicaciones de Node. 

Otra característica conveniente de RapydScrypt: ofrece nomenclaturas de Python y JavaScript para ciertas operaciones cuando es posible. Por ejemplo, el $símbolo especial utilizado por jQuery funciona como está en RapydScript, y las matrices pueden admitir los métodos .push(JavaScript) y .append(Python).

Transcriptar

Si escuchas el nombre Transcrypt y piensas en TypeScript, no estás lejos de la marca. Transcrypt sigue la misma idea básica: transpila Python a JavaScript. También intenta preservar, siempre que sea posible, la estructura y los modismos del código Python original, incluidas construcciones como lambdas y herencia múltiple entre clases.

Además, se pueden generar mapas de origen para el código transpilado que apuntan al Python original, por lo que los desarrolladores pueden depurar usando ese código en lugar del JavaScript generado. Según la documentación, Transcrypt realiza estas tareas con el módulo Árbol de sintaxis abstracta de CPython, que permite el acceso mediante programación a la forma en que Python analiza su propio código.

Una de las mayores ventajas de Transcrypt es el acceso automático al modelo de objetos de documento (DOM) de JavaScript. Si intenta acceder  document.getElementById en Python, por ejemplo, el código convertido utilizará el real  document.getElementById en JavaScript.

Un proyecto asociado, y todavía muy en secreto, es Numscrypt, que transfiere la biblioteca de matemáticas y estadísticas de NumPy a JavaScript. Hasta ahora, Numscrypt proporciona solo un subconjunto de las características de NumPy, aunque estas características (por ejemplo, matemáticas matriciales) se encuentran entre las más utilizadas. Sin embargo, Numscrypt no se ha actualizado desde 2018.