İşte Brython vs Transcrypt (Temmuz 2016, Transcrypt bu soruya OP tarafından bir seçenek olarak eklendiğinden beri), birkaç ay önce Brython ile bir projeye başlayıp Transcrypt'e (geçen hafta taşınması tamamlandı) taşınarak toplanan bazı bilgiler. Brython ve Transcrypt'i seviyorum ve ikisinin de kullanımlarını görebiliyorum.
Bu konuda yeni olan insanlar için, Brython ve Transcrypt python girdisini javascript'e 'transpile' (Düzen: Brython'u 'tarayıcı için bir Python uygulaması' olarak görmek daha iyidir çünkü bağımsız bir javascript üretmez). Her ikisi de Python 3 sözdizimi gerektirir. Brython, önemli sayıda Python standart kitaplığı içerir ve bunlardan bazıları web ile ilgili şeylerle uğraşmak için kendine aitken, Transcrypt bunu çoğunlukla önler ve bunun yerine Javascript kitaplıklarının kullanılmasını önerir.
Brython ( Github) tarayıcıda dönüşümü yapabilir. Yani python'da yazarsınız ve brython.js motoru, sayfa yüklendiğinde onu anında javascript'e dönüştürür. Bu gerçekten kullanışlıdır ve düşündüğünüzden çok daha hızlıdır. Ancak sayfalarınıza eklemeniz gereken brython.js motoru yaklaşık 500Kb'dir. Ayrıca, Brython'un XHR istekleriyle ayrı .js dosyalarını getirerek işlediği standart kitaplıkları içe aktarma meselesi de var. Bazı kütüphaneler zaten brython.js'de derlenmiştir, bu nedenle her içe aktarma yeni dosyaları çekmez, ancak çok sayıda içe aktarma kullanırsanız işler yavaşlayabilir. Ancak bunun etrafından dolaşmanın yolları var. Yaptığım şey, sayfa yüklendiğinde hangi dosyaların çekildiğini görmek için tarayıcı geliştirme araçlarındaki ağ sekmesini kontrol etmek ve ardından Brython src klasörünün bir kopyasında projemin kullanmadığı tüm dosyaları silmek, ve Brython'da bulunan betiği çalıştırın (bence Brython / www / scripts / make_VFS.py'de) mevcut tüm lib'leri py_VFS.js adında html'nizden de bağlamanız gereken tek bir dosyada derler. Normalde, büyük bir 2MB + dosya oluşturur, ancak kullanmadığınız şeyleri silerseniz, oldukça küçük olabilir. Bu şekilde yapmak, yalnızca brython.js, py_VFS.js ve python kodunuzu çekmeniz gerektiği ve ek XHR isteklerine gerek olmadığı anlamına gelir.
Transcrypt ( Github ) ise bir python 3 paketi olarak dağıtılırPython'u önceden javascript'e derlemek için manuel olarak kullanabilir veya araç zincirinize bağlanabilirsiniz. Yani Transcrypt ile, python'da yazarsınız, transcrypt'i python'a karşı çalıştırırsınız ve projenizde bağlanabileceğiniz javascript üretir. Çıktı üzerinde bir miktar kontrol sağlaması açısından daha çok geleneksel bir derleyici gibidir. Örneğin, ES6 veya ES5'e derlemeyi seçebilir veya ondan kaynak haritaların çıktısını vermesini isteyebilirsiniz (hata ayıklama sırasında tarayıcı sizi doğrudan, oluşturulan javascript kodunun içinde, ilgili python koduna götürecektir.) Transcrypt'in javascript çıktısı oldukça kısadır ( veya başka bir deyişle, güzel ve kısa). Benim durumumda 150kB python, 165kB küçültülmemiş ES5 javascript'e dönüştürülür. Karşılaştırma olarak, projemin Brython sürümü dönüşümden sonra yaklaşık 800Kb kullandı.
Bununla birlikte, Transcrypts kısalığının avantajlarından yararlanmak için belgeleri biraz (gerçekten biraz) okumak gerekir. Örneğin, Transcrypt ile Python'un dikte, küme ve liste gibi veri yapıları için 'doğruluğu' varsayılan olarak etkinleştirilmez ve genel olarak etkinleştirilmesi, yazım denetimi ile ilgili potansiyel performans sorunları nedeniyle önerilmez. Netlik sağlamak için: CPython altında, boş bir dikt, küme veya listenin doğruluk değeri False'a sahipken, Javascript'te "doğru" olarak kabul edilir .. Örnek:
myList = []
if myList:
Bunu ele almanın en az üç yolu vardır:
- Python'u javascript'e dönüştürürken -t işaretini kullanın, örneğin: $ transcrypt -t python.py (önerilmez, ancak performansa duyarlı kodun iç döngülerinde doğruluğu birçok kez kontrol etmediğiniz sürece muhtemelen bir sorun değildir ..)
- Transcrypt derleyicisine yerel olarak python benzeri doğruluk değerlerine otomatik dönüştürmeyi açmasını söylemek için
__pragma__(tconv)
veya __pragma__(notconv)
kodunuzun içinde kullanın .
- Doğruluk değerini kontrol etmek yerine, sadece len (myList)> 0'ı kontrol ederek problemden tamamen kaçının ... Belki çoğu durumda bu iyi olur, işi hafif kullanımım için yapar.
Doğru, projem büyüyordu ve bir performans artışı için önceden derlemek istedim ama Brython ile bunu yapmakta zorlandım (teknik olarak mümkün olsa da, çevrimiçi düzenleyiciyi kullanmanın ve görmek için javascript düğmesini tıklamanın kolay bir yolu çıktı). Bunu yaptım ve project.html'den oluşturulan javascript'e bağlandım ama nedense işe yaramadı. Ayrıca, Brython'dan gelen hata mesajlarını anlamakta zorlanıyorum, bu yüzden bu adım başarısız olduktan sonra nereden başlayacağımı bilmiyordum. Ayrıca, çıkarılan kodun büyüklüğü ve brython motorunun boyutu beni rahatsız etmeye başlamıştı. Bu yüzden Transcrypt'e daha yakından bakmaya karar verdim, çünkü ilk başta daha yüksek dereceli görünüyordu çünkü bana hemen nasıl başlayacağımı söyleyen basitleştirilmiş talimatları tercih ettim (o zamandan beri bunlar eklendi).
Python3.5'i kurduktan sonra kurulumunu sağlayan ana şey şuydu:
- Bir python3.5 proje klasörü oluşturmak için venv kullanın (her proje için daha az alan kullanan yeni yerleşik bir virtualenv sürümü gibidir) (sadece şunu yazın: python3.5 -m venv klasör adı - 3.5 için paket sorunları olan ubuntu için geçici çözüm ). Bu, diğer şeylerin yanı sıra bir bin alt klasörü ile 'klasör adı' yapar.
- Transcrypt python paketini, onu klasör adı / lib / python3.5 / site-packages / transcrypt'e yükleyen pip ('klasör adı / bin / pip yükleme transcrypt') ile kurun.
activate
Her seferinde klasör adı / bin / python3.5'in tam yolunu yazmak zorunda kalmamak için geçerli terminal. Yazarak etkinleştirin: 'kaynak klasör adı / bin / etkinleştirin'
- Kodu yazmaya ve test için javascript'te derlemeye başlayın. Kodunuzu yazdığınız klasörün içinden derleyin. Örneğin, klasör adı / www / proje kullandım. O klasöre CD koyun ve şunu çalıştırın: 'transcrypt -b your_python_script.py'. Bu, çıktıyı adlı bir alt klasöre koyar
__javascript__
. Daha sonra html'nizden çıktısı alınan javascript'e bağlanabilirsiniz.
Baştan aşağı hareket eden ana sorunlar
Oldukça basit ihtiyaçlarım var, bu yüzden kilometreniz değişebilir.
Brython veya python standart kitaplıklarını javascript kitaplıklarıyla değiştirmeniz gerekir. Örneğin, 'import json' Brython tarafından sağlanır, ancak Transcrypt altında bir javascript kitaplığı kullanabilir veya doğrudan Python kodunuzda JSON.parse / JSON.stringify kullanabilirsiniz. Bir javascript kitaplığının küçültülmüş bir sürümünü doğrudan python kodunuza eklemek için bu biçimi kullanın (üçlü tırnak işaretlerine dikkat edin):
__pragma__ ('js', '{}', '''
// javascript code
''')
Brython'un html'ye özgü işlevleri Transcrypt ile açıkça çalışmıyor. Sadece normal javascript yöntemlerini kullanın. Örnekler: 1) Brython altında, 'document [' id ']' kullanarak belirli bir HTML etiketine başvurmuş olabilirsiniz, ancak Transcrypt ile 'document.getElementById (' id ') (aynı şekilde javascript'ten). 2) 'del nodeName' ile bir düğümü silemezsiniz (bcs bu bir brython işlevi). 'Node.parentNode.removeChild (node)' gibi bir şey kullanın. 3) brython'un tüm DOM işlevlerini javascript alternatifleriyle değiştirin. örneğin, sınıf_adı = sınıfAdı; text = textContent; html = innerHTML; parent = parentNode; children = childNodes vb. Bazı eski tarayıcıların gerektirdiği alternatifleri içeren bir şeye ihtiyacınız varsa, o zaman bunun için javascript kitaplıkları vardır. 4) Brython'un set_timeout'u javascripts setTimeout ile değiştirilir. 5) BR () gibi Brython html etiketlerinin normal javascript yöntemleri kullanılarak değiştirilmesi ve <= dom manipülasyon sözdizimi olan herhangi bir yeri yeniden yapılması gerekir. Düz metin işaretlemesini innerHTML olarak enjekte edin veya öğeleri javascript sözdizimini kullanarak yapın ve ardından normal javascript DOM sözdizimini kullanarak ekleyin. Ayrıca brython'un onay kutuları için "if checkbox = 'işaretli':" kullandığını, ancak Transcrypt'in "eğer onay kutusu:" ile mutlu olduğunu fark ettim .. Düz metin işaretlemesini innerHTML olarak enjekte edin veya öğeleri javascript sözdizimini kullanarak yapın ve ardından normal javascript DOM sözdizimini kullanarak ekleyin. Ayrıca brython'un onay kutuları için "if checkbox = 'işaretli':" kullandığını, ancak Transcrypt'in "eğer onay kutusu:" ile mutlu olduğunu fark ettim .. Düz metin işaretlemesini innerHTML olarak enjekte edin veya öğeleri javascript sözdizimini kullanarak yapın ve ardından normal javascript DOM sözdizimini kullanarak ekleyin. Ayrıca brython'un onay kutuları için "if checkbox = 'işaretli':" kullandığını, ancak Transcrypt'in "eğer onay kutusu:" ile mutlu olduğunu fark ettim ..
Geçen hafta 2700 hat projesini taşımayı bitirdim, bu sırada Transcrypt birkaç küçük şeyi desteklemedi (ancak dolgu maddeleri ile değiştirilebilecek kadar kolaydı), bunlar 1) str.lower, str.split (str. split mevcut, ancak davranışına güvendiğim python sürümünden farklı çalışan javascript split gibi görünüyor), 2) round (bu, şu anda geliştirme sürümünde destekleniyor gibi görünüyor) ve 3) isinstance didn str, int ve float üzerinde çalışır, sadece dict, list ve set üzerinde çalışır. 4) Brython'dan fark ettiğim bir diğer fark, bir diktenin JSON temsilini alırsam, bunu 'myDict = dict (data)' kullanarak yapmam gerektiğidir, oysa brython 'myDict = data' ile mutluydu. Ancak bu, Brython'un json.loads dosyasında doğrudan JSON.parse ile değiştirdiğim bir şeyle ilgili olabilir.__pragma__('opov')
yerel için), aşırı yüklenmiş formatı kullanarak set işlemleri gibi şeyler yapamazsınız, ancak karşılık gelen işlevleri kullanmanız gerekir. Örneğin
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) Ayrıca, varsayılan olarak 'for i in dict:' kullanarak dikteleri yineleyemezsiniz, bunu etkinleştirmeden (cmd line -i veya __pragma__('iconv')
, ancak sadece () üyesini kullanarak etkinleştirmek zorunda kalmayabilirsiniz , örn:
for key, value in dict.items():
Özetle
Brython'u seviyorum çünkü onunla başlamak ve kodunuzu test etmek kolay (sadece F5). Gerçek python'a daha yakın çünkü standart kitaplıkların çoğu orada. Tarayıcıya ve büyük çıktı javascript boyutuna transpilasyon motorunu dahil etmekten hoşlanmıyorum (Düzenleme: Ya da bir python VM olarak görüntülenebilir). İşleri baştan sona yapmak zorunda olsaydım (ama yine de Brython kullanarak), brython yöntemlerine çok fazla yaslanmak yerine DOM'u brython'dan değiştirmek için javascript yöntemlerini kullanırdım (bunu yapabilirsiniz ..) ihtiyaçlarım değiştiğinde başka bir aktarıcıya.
Transcrypt'i seviyorum çünkü çıktısı alınan javascript gerçekten 'zayıf ve ortalama' ve çünkü tarayıcı tarafını yüklediğiniz tek şey, boyut olarak python kodunuza benzer olan oluşturulmuş javascript kodunuz. Ayrıca kaynak haritalarını desteklediği ve çıktısı alınan javascript üzerinde bana bir kontrol ölçüsü verdiği için. Ve bunu kullanmak bana optimizasyon hakkında oldukça fazla şey öğretti.
Umarım bu, birinin kendi projeleri için bunlardan hangisinin iyi olabileceğini görmesine yardımcı olur.