Ecco alcune informazioni su Brython vs Transcrypt (luglio 2016, poiché Transcrypt è stato aggiunto come opzione su questa domanda dall'OP), raccolte avviando un progetto con Brython alcuni mesi fa e passando a Transcrypt (completato lo spostamento la scorsa settimana). Mi piacciono Brython e Transcrypt e posso vedere gli usi per entrambi.
Per le persone che sono nuove a questo, Brython e Transcrypt entrambi 'transpile' input python in javascript (Modifica: forse è meglio vedere Brython come una 'implementazione Python per il browser' perché non produce javascript autonomo). Entrambi richiedono la sintassi di Python 3. Brython include un numero sostanziale di librerie standard Python e alcune delle sue per gestire le cose relative al web, mentre Transcrypt lo evita per la maggior parte e suggerisce di utilizzare invece le librerie Javascript.
Brython ( Github) può eseguire la conversione nel browser. Quindi scrivi in python e il motore brython.js lo converte in javascript al volo quando la pagina viene caricata. Questo è davvero comodo ed è molto più veloce di quanto potresti pensare. Tuttavia, il motore brython.js che devi includere nelle tue pagine è di circa 500Kb. Inoltre, c'è la questione dell'importazione di librerie standard, che Brython gestisce recuperando file .js separati con richieste XHR. Alcune librerie sono già compilate in brython.js, quindi non tutte le importazioni attireranno nuovi file, ma se si utilizzano molte importazioni, le cose possono rallentare. Tuttavia, ci sono modi per aggirare questo problema. Quello che ho fatto è stato controllare la scheda di rete negli strumenti di sviluppo del browser per vedere quali file venivano inseriti quando la pagina è stata caricata, quindi eliminare tutti i file che il mio progetto non stava utilizzando in una copia della cartella Brython src, ed esegui lo script incluso con Brython (penso sia su Brython / www / scripts / make_VFS.py) che compila tutte le librerie disponibili in un file chiamato py_VFS.js a cui devi anche collegarti dal tuo html. Normalmente, creerà un enorme file da 2 MB +, ma se elimini le cose che non stai utilizzando, può essere piuttosto piccolo. In questo modo, significa che devi solo inserire brython.js, py_VFS.js e il tuo codice Python e non saranno necessarie ulteriori richieste XHR.
Transcrypt ( Github ) d'altra parte, è distribuito come pacchetto python 3che puoi usare manualmente, o agganciarti alla tua toolchain, per compilare in anticipo python in javascript. Quindi con Transcrypt, scrivi in python, esegui transcrypt contro il python e sputa javascript a cui puoi collegarti nel tuo progetto. È più simile a un compilatore tradizionale anche in quanto offre un certo controllo sull'output. Ad esempio, puoi scegliere di compilare su ES6 o ES5, o chiedergli di generare mappe sorgente (che durante il debug lascia che il browser ti porti direttamente al codice Python corrispondente, all'interno del codice javascript generato). L'output javascript di Transcrypt è piuttosto conciso ( o in altre parole, è carino e conciso). Nel mio caso 150kB di python vengono convertiti in 165kB di javascript ES5 non minimizzato. A titolo di confronto, la versione Brython del mio progetto utilizzava circa 800Kb dopo la conversione.
Tuttavia, per ottenere i vantaggi della concisione di Transcrypts, è necessario leggere un po 'i documenti (davvero solo un po'). Ad esempio, con Transcrypt, la "veridicità" di Python per strutture di dati come dict, set e list non è abilitata per impostazione predefinita e l'abilitazione globale è sconsigliata a causa di potenziali problemi di prestazioni legati al controllo dei tipi. Per chiarezza: in CPython, un dict, un insieme o un elenco vuoto ha il valore di verità False, mentre in Javascript è considerato "vero". Esempio:
myList = []
if myList:
Esistono almeno tre modi per risolvere questo problema:
- Usa il flag -t quando converti python in javascript, ad esempio: $ transcrypt -t python.py (non consigliato, ma probabilmente non è un problema a meno che tu non controlli la veridicità molte volte nei cicli interni di codice sensibile alle prestazioni ..)
- Usa
__pragma__(tconv)
o __pragma__(notconv)
all'interno del codice per dire al compilatore transcrypt di attivare la conversione automatica in valori di verità simili a python localmente.
- Invece di controllare il valore di verità, evita del tutto il problema semplicemente controllando len (myList)> 0 ... Forse andrà bene per la maggior parte delle situazioni, fa il lavoro per il mio uso leggero.
Giusto, quindi il mio progetto stava diventando più grande e volevo precompilare per migliorare le prestazioni, ma ho trovato difficile farlo con Brython (sebbene sia tecnicamente possibile, un modo semplice è usare l' editor online e fare clic sul pulsante javascript per vedere Il risultato). L'ho fatto e mi sono collegato al javascript generato da project.html ma non ha funzionato per qualche motivo. Inoltre, trovo difficile capire i messaggi di errore di Brython, quindi non sapevo da dove iniziare dopo che questo passaggio non è riuscito. Inoltre, la grande dimensione del codice emesso e la dimensione del motore Brython cominciavano a darmi fastidio. Quindi ho deciso di dare un'occhiata più da vicino a Transcrypt, che all'inizio sembrava essere di livello superiore perché preferisco istruzioni stupide che mi dicono come iniziare immediatamente (queste sono state aggiunte da allora).
La cosa principale per impostarlo dopo l'installazione di Python3.5 era:
- Usa venv (è come una nuova versione integrata di virtualenv che utilizza meno spazio per ogni progetto) per configurare una cartella di progetto python3.5 (basta digitare: python3.5 -m nome cartella venv - soluzione alternativa per ubuntu con problemi di pacchetto per 3.5 ). Questo rende 'nomecartella' con una sottocartella bin tra le altre cose.
- Installa il pacchetto Transcrypt python con pip ('nomecartella / bin / pip install transcrypt') che lo installa in nomecartella / lib / python3.5 / site-packages / transcrypt.
activate
il terminale corrente se non si desidera dover digitare il percorso completo di nomecartella / bin / python3.5 ogni volta. Attiva digitando: "nome cartella di origine / bin / attivare"
- Inizia a scrivere codice e compilarlo in javascript per il test. Compila dalla cartella in cui scrivi il tuo codice. Ad esempio, ho usato nomecartella / www / progetto. Quindi CD in quella cartella ed esegui: "transcrypt -b your_python_script.py". Questo mette l'output in una sottocartella chiamata
__javascript__
. Puoi quindi collegarti al javascript emesso dal tuo html.
Principali problemi in corso
Ho esigenze piuttosto semplici, quindi il tuo chilometraggio potrebbe variare.
È necessario sostituire le librerie standard brython o python con librerie javascript. Quindi, ad esempio, "import json" è fornito da Brython, ma in Transcrypt è possibile utilizzare una libreria javascript o semplicemente utilizzare JSON.parse / JSON.stringify direttamente nel codice Python. Per includere una versione minimizzata di una libreria javascript direttamente nel tuo codice python usa questo formato (nota le virgolette triple):
__pragma__ ('js', '{}', '''
// javascript code
''')
Ovviamente le funzioni html specifiche di Brython non funzionano con Transcrypt. Usa i normali metodi javascript. Esempi: 1) in Brython, potresti aver fatto riferimento a un tag HTML specifico usando 'document [' id ']', ma con Transcrypt avresti usato 'document.getElementById (' id ') (che è lo stesso modo da javascript). 2) Non puoi eliminare un nodo con 'del nodeName' (bcs che è una funzione brython). Usa qualcosa come 'node.parentNode.removeChild (node)'. 3) sostituire tutte le funzioni DOM di brython con le alternative javascript. ad es. class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes ecc. Immagino che se hai bisogno di qualcosa che contenga alternative richieste da alcuni browser meno recenti, allora ci sono librerie javascript per questo. 4) Il set_timeout di Brython è sostituito con javascripts setTimeout 5) I tag html di Brython come BR () devono essere sostituiti usando i normali metodi di javascript così come rifare qualsiasi posto che hai usato è la sintassi di manipolazione <= dom. Iniettare il markup di testo normale come innerHTML o creare gli elementi utilizzando la sintassi javascript e quindi allegarli utilizzando la normale sintassi DOM javascript. Ho anche notato che per le caselle di controllo brython usa "if checkbox = 'checks':" ma Transcrypt è soddisfatto di "if checkbox:" .. Iniettare il markup di testo normale come innerHTML o creare gli elementi utilizzando la sintassi javascript e quindi allegarli utilizzando la normale sintassi DOM javascript. Ho anche notato che per le caselle di controllo brython usa "if checkbox = 'checks':" ma Transcrypt è soddisfatto di "if checkbox:" .. Iniettare il markup di testo normale come innerHTML o creare gli elementi utilizzando la sintassi javascript e quindi allegarli utilizzando la normale sintassi DOM javascript. Ho anche notato che per le caselle di controllo brython usa "if checkbox = 'checks':" ma Transcrypt è soddisfatto di "if checkbox:" ..
Ho finito di spostare un progetto a 2700 linee la scorsa settimana, momento in cui Transcrypt non aveva il supporto per alcune cose minori (sebbene fossero abbastanza facili da sostituire con i riempitivi), questi erano 1) str.lower, str.split (str. split è presente, ma sembra essere lo split javascript, che funziona in modo diverso rispetto alla versione python, il cui comportamento mi basavo), 2) round (questo sembra essere supportato nella versione dev ora) e 3) isinstance didn non funziona su str, int e float, solo su dict, list e set. 4) Un'altra differenza da Brython che ho notato è che se inserisco una rappresentazione JSON di un dict, devo farlo usando 'myDict = dict (data)', mentre brython era soddisfatto di 'myDict = data'. Ma questo potrebbe essere correlato a qualcosa in json.loads di Brython, che ho sostituito direttamente con JSON.parse.__pragma__('opov')
per local), non puoi fare cose come le operazioni sugli insiemi usando il formato sovraccarico, ma devi usare le funzioni corrispondenti. Per esempio
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) Inoltre, non puoi iterare dict per impostazione predefinita usando 'for i in dict:', senza abilitarlo (riga cmd -i o __pragma__('iconv')
, ma puoi evitare di doverlo abilitare semplicemente usando il membro keys () es:
for key, value in dict.items():
Riassumere
Mi piace Brython perché è facile utilizzarlo e testare il codice (solo F5). È più vicino al vero python perché la maggior parte della libreria standard è lì. Non mi piace dover includere il motore di transpilation (Modifica: oppure si potrebbe vederlo come una VM Python) nel browser e le grandi dimensioni javascript emesse. Se avessi dovuto fare le cose (ma ancora usando Brython), avrei usato i metodi javascript per manipolare il DOM da brython (cosa che puoi fare ..), invece di appoggiarti così tanto ai metodi brython perché quello spreca tempo a spostarsi a un altro trasportatore quando le mie esigenze sono cambiate.
Mi piace Transcrypt perché il javascript emesso è davvero "snello e meschino" e perché l'unica cosa che carichi lato browser è il tuo codice javascript generato che è di dimensioni simili al tuo codice python. Anche perché supporta le mappe sorgente e perché mi dà una misura di controllo sul javascript emesso. E usarlo mi ha insegnato parecchio sull'ottimizzazione.
Spero che questo aiuti qualcuno a capire quale di questi potrebbe essere utile per il suo particolare progetto.