So konvertieren Sie Python in JavaScript (und wieder zurück)

Python oder JavaScript? Während wir uns immer noch darüber streiten, wer die Oberhand oder die bessere Zukunft hat, gibt es kaum Zweifel, wem das Frontend des Webs gehört. Es ist JavaScript im Browser oder nichts.

Na ja, vielleicht nicht  nichts.  JavaScript ist eine bevorzugte Zielsprache für „Transpiler“, die eine Programmiersprache in eine andere konvertieren (siehe: TypeScript, Emscripten, Cheerp, Cor). Und Pythons große Fangemeinde und die Fülle verfügbarer Bibliotheken machen es zu einem großartigen Kandidaten, um in JavaScript konvertiert, dh transpiliert zu werden.

Hier sind vier aktuelle Projekte, um Python in der JavaScript-Welt nützlich zu machen. Man zeichnet sich dadurch aus, dass man in beide Richtungen konvertieren kann.

Brython

Eines der Versprechen, die WebAssembly macht, besteht darin, dass wir jede Sprache verwenden können, die wir für das Web entwickeln, obwohl dies ein weit entferntes Ziel bleibt. Die Philosophie hinter Brython, zumindest was Python 3 betrifft, ist, warum warten?

Brython implementiert eine Version von Python 3 für die clientseitige Webprogrammierung über eine JavaScript-Bibliothek, die alle Schlüsselwörter und die meisten integrierten Funktionen für Python 3 emuliert. In Python geschriebene Skripte können direkt in eine Webseite aufgenommen werden. Brython bietet eine übergeordnete Python-Modulschnittstelle (das  browser Paket) für die Interaktion mit dem DOM und dem Browser, dh für alle Arbeiten, die normalerweise direkt in JavaScript ausgeführt werden.

Viele Live-Codebeispiele und eine Galerie mit Mini-Anwendungen zeigen, wie alles funktioniert. Es ist sogar möglich, mit Brython eine native Android-App in Python zu schreiben. Asynchrone Funktionen sind verfügbar, obwohl Sie das Brython- asyncModul anstelle des Python-Moduls verwenden müssen asyncio.

Brython entgeht nicht den Einschränkungen, die JavaScript im Browser auferlegt wurden. Beispielsweise wird der Umgang mit dem lokalen Dateisystem nicht unterstützt. Es gibt jedoch Unterstützung für die Verwendung des lokalen HTML5-Speichers, wenn Sie lediglich eine Möglichkeit benötigen, Daten pro Anwendung zu speichern.

JavaScripthon

JavaScripthon konzentriert sich ausschließlich auf die Übersetzung von Python 3.5 und höherem Code in JavaScript, ohne zu versuchen, eine vollständige Unterstützung im Browser gemäß Projekten wie Brython bereitzustellen. Es gibt ES6-Code aus, um den Bedarf an Polyfills auf der Browserseite zu minimieren, und spielt gut mit Tools wie Webpack, indem Quellkarten beibehalten werden.

Die meisten gängigen Schlüsselwörter und Verhaltensweisen von Python werden unterstützt, einschließlich asyncund await, Python 3.6-F-Strings sowie Python-Klassenmethoden und Vererbungen. Sie können JavaScript auch über einen speziellen Funktionsaufruf inline einfügen, falls Sie jemals direkt auf JavaScript zugreifen müssen.

Beachten Sie, dass die letzten Commits für das JavaScripthon-Projekt im Mai 2018 stattfanden, sodass die neuesten Python-Funktionen wie der „Walross-Operator“ nicht unterstützt wurden. Jeder, der Python 3.6-Funktionen verwendet, sollte jedoch gut unterstützt werden.

[Ebenfalls am: 24 Python-Bibliotheken für jeden Python-Entwickler]

Jiphy

Der Name Jiphy ist eine Abkürzung für "JavaScript in, Python out". Mit anderen Worten, Jiphy konvertiert in beide Richtungen zwischen den beiden Sprachen. Außerdem kann Code aus beiden Sprachen gemischt werden, bevor er in eine der beiden Zielsprachen konvertiert wird.

Beachten Sie Folgendes, bevor Sie mit der Konvertierung von OpenStack in JavaScript beginnen: Bei Jiphy geht es nicht um eine vollständige Codebasiskonvertierung. Vielmehr besteht seine Funktion, wie die README es ausdrückt, darin, "die Kontextumschaltung zu reduzieren, die ein Python-Entwickler benötigt, um JavaScript-Code zu schreiben und umgekehrt".

Der größte Nachteil von Jiphy ist, dass es nur einen Teil der Python-Funktionen unterstützt. Es sind weder Klassen noch Standardargumente verfügbar, obwohl Dekoratoren und Ausnahmen unterstützt werden. Ein Großteil davon ist darauf zurückzuführen, dass Jiphy eine zeilenweise Beziehung zwischen Quell- und Zielcode anstrebt. Die Entwickler haben jedoch die neuen Funktionen in ES6 für eine erweiterte Unterstützung der Python-Funktionen in Betracht gezogen.

Beachten Sie, dass das Jiphy-Projekt seit Ende 2017 nicht mehr aktualisiert wurde. Jiphy sollte als streng experimentell betrachtet werden, bis die Arbeit daran wieder aufgenommen wird.

JS2Py

JS2Py konvertiert JavaScript, wie der Name schon sagt, mithilfe einer reinen Python-Konvertierungs-Engine in Python. Es hat derzeit nur offizielle Unterstützung für ES5, obwohl es experimentelle ES6-Unterstützung für Mutige und Mutige gibt.

JS2Py unterstützt eine Vielzahl von Interoperationen zwischen Python und JavaScript. Sie können vorhandene Node.js-Module mithilfe einer js2py.requireMethode in Ihren Python-Code importieren . Variablen von der JavaScript-Seite können auf der Python-Seite ausgewertet werden, und Python-Objekte können auch aus JavaScript-Code verwendet werden.

JS2Py enthält auch eine sehr experimentelle virtuelle Maschine, die JavaScript-Code aus Python auswertet, aber für die Verwendung in der Produktion noch nicht empfohlen wird.

RapydScript

RapydScript verspricht "Pythonic JavaScript, das nicht saugt." Das Projekt ähnelt CoffeeScript dahingehend, dass es Code aufnimmt, der in einer alternativen Sprache geschrieben wurde - in diesem Fall eine Variante von Python - und JavaScript generiert, das überall so ausgeführt werden kann, wie es ist. 

Somit bietet RapydScript das Beste aus beiden Welten und bringt Pythons saubere Syntax in JavaScript-Funktionen wie anonyme Funktionen, DOM-Manipulation und die Möglichkeit, JavaScript-Bibliotheken wie jQuery oder den Node.js-Kern zu nutzen. Das ist richtig - Sie können Rapydscript-generierten Code verwenden, um Webseiten oder Node-Apps zu betreiben. 

Eine weitere praktische Funktion von RapydScrypt: Es bietet nach Möglichkeit sowohl Python- als auch JavaScript-Nomenklaturen für bestimmte Vorgänge. Beispielsweise $funktioniert das von jQuery verwendete spezielle Symbol in RapydScript unverändert, und Arrays können sowohl die Methoden .push(JavaScript) als auch die .appendMethode (Python) unterstützen.

Verschlüsseln

Wenn Sie den Namen Transcrypt hören und an TypeScript denken, sind Sie nicht weit von der Marke entfernt. Transcrypt folgt der gleichen Grundidee: Es transpiliert Python in JavaScript. Es wird auch versucht, die Struktur und die Redewendungen des ursprünglichen Python-Codes, wo immer möglich, beizubehalten, einschließlich Konstrukten wie Lambdas und Mehrfachvererbung über Klassen hinweg.

Darüber hinaus können Quellzuordnungen für den transpilierten Code generiert werden, die auf das ursprüngliche Python verweisen, sodass Entwickler mit diesem Code anstelle des generierten JavaScript debuggen können. Laut Dokumentation führt Transcrypt diese Aufgaben mit dem Abstract Syntax Tree-Modul von CPython aus, das den programmgesteuerten Zugriff auf die Art und Weise ermöglicht, wie Python seinen eigenen Code analysiert.

Einer der größten Vorteile von Transcrypt ist der automatische Zugriff auf das Document Object Model (DOM) von JavaScript. Wenn Sie beispielsweise versuchen, document.getElementById in Python zuzugreifen  , verwendet der konvertierte Code den tatsächlichen  document.getElementById in JavaScript.

Ein zugehöriges Projekt, das noch immer stark unter Verschluss ist, ist Numscrypt, das die NumPy-Bibliothek für Mathematik und Statistiken auf JavaScript portiert. Bisher bietet Numscrypt nur eine Teilmenge der Funktionen von NumPy, obwohl diese Funktionen (z. B. Matrixmathematik) zu den am häufigsten verwendeten gehören. Numscrypt wurde jedoch seit 2018 nicht mehr aktualisiert.