Berikut beberapa info tentang Brython vs Transcrypt (Juli 2016, sejak Transcrypt ditambahkan sebagai opsi pada pertanyaan ini oleh OP), dikumpulkan dengan memulai proyek dengan Brython beberapa bulan yang lalu dan pindah ke Transcrypt (selesai pindah minggu lalu). Saya suka Brython dan Transcrypt dan dapat melihat kegunaan keduanya.
Untuk orang yang baru mengenal ini, Brython dan Transcrypt keduanya 'transpile' input python ke javascript (Sunting: mungkin lebih baik melihat Brython sebagai 'implementasi Python untuk browser' karena tidak menghasilkan javascript mandiri). Keduanya membutuhkan sintaks Python 3. Brython menyertakan sejumlah besar pustaka standar Python dan beberapa di antaranya sendiri untuk menangani hal-hal terkait web, sedangkan Transcrypt menghindarinya untuk sebagian besar dan menyarankan menggunakan pustaka Javascript sebagai gantinya.
Brython ( Github) dapat melakukan konversi di browser. Jadi Anda menulis dengan python dan mesin brython.js mengubahnya menjadi javascript dengan cepat ketika halaman dimuat. Ini sangat nyaman, dan jauh lebih cepat dari yang Anda kira. Namun, mesin brython.js yang perlu Anda sertakan di halaman Anda berukuran sekitar 500Kb. Juga, ada masalah mengimpor pustaka standar, yang ditangani Brython dengan mengambil file .js terpisah dengan permintaan XHR. Beberapa lib sudah dikompilasi menjadi brython.js, jadi tidak setiap impor akan menarik file baru, tetapi jika Anda menggunakan banyak impor, semuanya bisa menjadi lambat. Namun, ada cara untuk mengatasi ini. Apa yang saya lakukan adalah memeriksa tab jaringan di alat pengembang browser untuk melihat file apa yang ditarik saat halaman dimuat, lalu hapus semua file yang tidak digunakan proyek saya dalam salinan folder src Brython, dan jalankan skrip yang disertakan dengan Brython (menurut saya ada di Brython / www / scripts / make_VFS.py) yang mengkompilasi semua lib yang tersedia menjadi satu file bernama py_VFS.js yang juga perlu Anda tautkan dari html Anda. Biasanya, itu akan membuat satu file besar 2MB +, tetapi jika Anda menghapus hal-hal yang tidak Anda gunakan, itu bisa sangat kecil. Melakukannya dengan cara ini, berarti Anda hanya perlu menarik brython.js, py_VFS.js dan kode python Anda, dan tidak ada permintaan XHR tambahan yang diperlukan.
Transcrypt ( Github ) di sisi lain, didistribusikan sebagai paket python 3yang dapat Anda gunakan secara manual, atau terhubung ke toolchain Anda, untuk mengkompilasi python ke javascript terlebih dahulu. Jadi dengan Transcrypt, Anda menulis dengan python, menjalankan transcrypt terhadap python dan itu mengeluarkan javascript yang dapat Anda tautkan dalam proyek Anda. Ini lebih seperti kompiler tradisional karena menawarkan beberapa kontrol atas output. Misalnya, Anda dapat memilih untuk mengompilasi ke ES6 atau ES5, atau memintanya untuk mengeluarkan peta sumber (bahwa selama debugging biarkan browser membawa Anda langsung ke kode python yang sesuai, selain kode javascript yang dihasilkan.) Output javascript Transcrypt cukup singkat ( atau dengan kata lain, itu cantik dan singkat). Dalam kasus saya, 150kB python diubah menjadi 165kB javascript ES5 tanpa ukuran. Sebagai perbandingan, versi Brython dari proyek saya menggunakan sekitar 800Kb setelah konversi.
Namun, untuk mendapatkan manfaat dari ketegasan Transcrypts, membutuhkan membaca dokumen sedikit (benar-benar hanya sedikit). Misalnya, dengan Transcrypt, 'kebenaran' Python untuk struktur data seperti dict, set, dan list tidak diaktifkan secara default dan mengaktifkannya secara global tidak disarankan karena potensi masalah kinerja terkait dengan pemeriksaan ketik. Untuk kejelasan: Di bawah CPython, sebuah dict, set atau list kosong memiliki nilai kebenaran False, sedangkan di Javascript dianggap 'true' .. Contoh:
myList = []
if myList:
Setidaknya ada tiga cara untuk mengatasinya:
- Gunakan tanda -t saat mengonversi python ke javascript misalnya: $ transcrypt -t python.py (tidak disarankan, tetapi mungkin tidak menjadi masalah kecuali Anda memeriksa kebenarannya berkali-kali di loop dalam dari kode sensitif kinerja ..)
- Gunakan
__pragma__(tconv)
atau di __pragma__(notconv)
dalam kode Anda untuk memberi tahu kompilator transcrypt untuk mengaktifkan konversi otomatis ke nilai kebenaran seperti python secara lokal.
- Alih-alih memeriksa nilai kebenaran, hindari masalah sama sekali dengan hanya memeriksa len (myList)> 0 ... Mungkin itu akan baik-baik saja untuk sebagian besar situasi, lakukan pekerjaan untuk penggunaan ringan saya.
Benar, jadi proyek saya semakin besar dan saya ingin melakukan pra-kompilasi untuk mendapatkan kinerja tetapi merasa sulit melakukannya dengan Brython (meskipun secara teknis memungkinkan, cara mudah untuk menggunakan editor online dan klik tombol javascript untuk melihat hasil). Saya melakukan itu dan menautkan ke javascript yang dihasilkan dari project.html tetapi tidak berhasil karena beberapa alasan. Juga, saya merasa sulit untuk memahami pesan kesalahan dari Brython sehingga saya tidak tahu harus mulai dari mana setelah langkah ini gagal. Juga, ukuran besar kode yang dikeluarkan dan ukuran mesin brython mulai mengganggu saya. Jadi saya memutuskan untuk melihat lebih dekat Transcrypt, yang pada awalnya tampak memiliki nilai yang lebih tinggi karena saya lebih suka instruksi bodoh yang memberi tahu saya cara memulai segera (ini telah ditambahkan).
Hal utama untuk menyiapkannya setelah menginstal Python3.5 adalah:
- Gunakan venv (ini seperti versi virtualenv bawaan baru yang menggunakan lebih sedikit ruang untuk setiap proyek) untuk menyiapkan folder proyek python3.5 (cukup ketik: python3.5 -m venv nama folder - solusi untuk ubuntu dengan masalah paket untuk 3.5 ). Ini membuat 'nama folder' dengan subfolder bin antara lain.
- Instal paket Transcrypt python dengan pip ('foldername / bin / pip install transcrypt') yang menginstalnya ke foldername / lib / python3.5 / site-packages / transcrypt.
activate
terminal saat ini jika Anda tidak ingin harus mengetikkan path lengkap ke nama folder / bin / python3.5 setiap saat. Aktifkan dengan mengetik: 'nama folder sumber / bin / aktifkan'
- Mulailah menulis kode dan kompilasi ke javascript untuk pengujian. Kompilasi dari dalam folder tempat Anda menulis kode Anda. Misalnya, saya menggunakan nama folder / www / proyek. Jadi CD ke folder itu dan jalankan: 'transcrypt -b your_python_script.py'. Itu menempatkan output dalam subfolder yang disebut
__javascript__
. Anda kemudian dapat menautkan ke javascript yang dikeluarkan dari html Anda.
Masalah utama berpindah
Saya memiliki kebutuhan yang agak sederhana, jadi jarak tempuh Anda mungkin berbeda.
Anda perlu mengganti lib standar brython atau python dengan libs javascript. Jadi misalnya 'import json' disediakan oleh Brython, tetapi di bawah Transcrypt Anda dapat menggunakan javascript lib atau hanya menggunakan JSON.parse / JSON.stringify langsung di kode Python Anda. Untuk menyertakan versi perpustakaan javascript yang dikecilkan secara langsung di kode python Anda, gunakan format ini (perhatikan tanda kutip tiga):
__pragma__ ('js', '{}', '''
// javascript code
''')
Fungsi spesifik html Brython jelas tidak berfungsi dengan Transcrypt. Cukup gunakan cara javascript biasa. Contoh: 1) di bawah Brython, Anda mungkin merujuk ke tag HTML tertentu menggunakan 'document [' id ']', tetapi dengan Transcrypt Anda akan menggunakan 'document.getElementById (' id ') (yang sama seperti yang Anda lakukan itu dari javascript). 2) Anda tidak dapat menghapus node dengan 'del nodeName' (bcs itu adalah fungsi brython). Gunakan sesuatu seperti 'node.parentNode.removeChild (node)'. 3) ganti semua fungsi DOM brython dengan alternatif javascript. misalnya class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes dll. Saya kira jika Anda membutuhkan sesuatu yang berisi alternatif yang dibutuhkan oleh beberapa browser lama maka ada perpustakaan javascript untuk itu. 4) Set_timeout Brython diganti dengan javascripts setTimeout 5) Tag html Brython seperti BR () perlu diganti menggunakan cara javascript normal serta mengulang tempat yang Anda gunakan <= dom manipulation syntax. Masukkan markup teks biasa sebagai innerHTML atau buat elemen menggunakan sintaks javascript, lalu lampirkan menggunakan sintaks DOM javascript normal. Saya juga memperhatikan bahwa untuk kotak centang, brython menggunakan "if checkbox = 'memeriksa':" tetapi Transcrypt senang dengan "jika kotak centang:" .. Masukkan markup teks biasa sebagai innerHTML atau buat elemen menggunakan sintaks javascript, lalu lampirkan menggunakan sintaks DOM javascript normal. Saya juga memperhatikan bahwa untuk kotak centang, brython menggunakan "if checkbox = 'memeriksa':" tetapi Transcrypt senang dengan "jika kotak centang:" .. Masukkan markup teks biasa sebagai innerHTML atau buat elemen menggunakan sintaks javascript, lalu lampirkan menggunakan sintaks DOM javascript normal. Saya juga memperhatikan bahwa untuk kotak centang, brython menggunakan "if checkbox = 'memeriksa':" tetapi Transcrypt senang dengan "jika kotak centang:" ..
Saya selesai memindahkan proyek 2700 baris selama minggu lalu di mana Transcrypt tidak memiliki dukungan untuk beberapa hal kecil (meskipun cukup mudah untuk diganti dengan pengisi), ini adalah 1) str.lower, str.split (str. split ada, tetapi tampaknya merupakan pemisahan javascript, yang bekerja secara berbeda dengan versi python, perilaku yang saya andalkan), 2) putaran (ini tampaknya didukung dalam versi dev sekarang) dan 3) isinstance tidak tidak bekerja pada str, int dan float, hanya pada dict, list dan set. 4) Perbedaan lain dari Brython yang saya perhatikan adalah bahwa jika saya menarik representasi JSON dari sebuah dict, saya perlu melakukannya menggunakan 'myDict = dict (data)', sedangkan brython senang dengan 'myDict = data'. Tapi itu mungkin terkait dengan sesuatu di json.loads Brython, yang saya ganti langsung dengan JSON.parse.__pragma__('opov')
untuk lokal), Anda tidak dapat melakukan hal-hal seperti operasi set menggunakan format kelebihan beban, tetapi perlu menggunakan fungsi yang sesuai. Misalnya
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) Selain itu, Anda tidak dapat mengulang dicts secara default menggunakan 'for i in dict:', tanpa mengaktifkannya (cmd line -i atau __pragma__('iconv')
, tetapi Anda dapat menghindari keharusan untuk mengaktifkannya hanya dengan menggunakan keys () anggota misalnya:
for key, value in dict.items():
Untuk meringkas
Saya suka Brython karena mudah untuk menggunakannya dan untuk menguji kode Anda (hanya F5). Ini lebih dekat dengan python sejati karena sebagian besar lib standar ada di sana. Saya tidak suka harus menyertakan mesin transpilasi (Sunting: Atau orang mungkin melihatnya sebagai VM python) di browser dan ukuran javascript keluaran besar. Jika saya harus melakukan banyak hal (tetapi masih menggunakan Brython), saya akan menggunakan metode javascript untuk memanipulasi DOM dari brython (yang dapat Anda lakukan ..), alih-alih banyak bersandar pada metode brython karena itu membuang waktu untuk berpindah ke transpiler lain saat kebutuhan saya berubah.
Saya suka Transcrypt karena javascript yang dikeluarkan benar-benar 'ramping dan berarti' dan karena satu-satunya hal yang Anda muat di sisi browser adalah kode javascript yang Anda buat yang ukurannya serupa dengan kode python Anda. Juga karena ia mendukung peta sumber dan karena memberi saya ukuran kendali atas javascript yang dikeluarkan. Dan menggunakannya mengajari saya sedikit tentang pengoptimalan.
Harapan yang membantu seseorang melihat mana di antara ini yang mungkin baik untuk proyek khusus mereka.