นี่คือข้อมูลบางส่วนเกี่ยวกับ Brython vs Transcrypt (กรกฎาคม 2016 เนื่องจากมีการเพิ่ม Transcrypt เป็นตัวเลือกสำหรับคำถามนี้โดย OP) รวบรวมโดยเริ่มต้นโครงการกับ Brython เมื่อไม่กี่เดือนที่ผ่านมาและย้ายไปที่ Transcrypt (ย้ายเสร็จเมื่อสัปดาห์ที่แล้ว) ฉันชอบ Brython และ Transcrypt และสามารถดูการใช้งานสำหรับทั้งคู่ได้
สำหรับคนที่ยังใหม่กับสิ่งนี้ Brython และ Transcrypt ทั้งอินพุต python 'Transcile' ไปยัง javascript (แก้ไข: อาจจะดีกว่าถ้ามองว่า Brython เป็น 'การใช้งาน Python สำหรับเบราว์เซอร์' เพราะมันไม่ได้สร้างจาวาสคริปต์แบบสแตนด์อโลน) ทั้งสองต้องใช้ไวยากรณ์ Python 3 Brython มีไลบรารีมาตรฐาน Python จำนวนมากและบางส่วนเป็นของตัวเองสำหรับจัดการกับสิ่งที่เกี่ยวข้องกับเว็บในขณะที่ Transcrypt หลีกเลี่ยงสิ่งนั้นส่วนใหญ่และแนะนำให้ใช้ไลบรารี Javascript แทน
ไบรตัน ( Github) สามารถทำการแปลงในเบราว์เซอร์ ดังนั้นคุณเขียนด้วย python และ brython.js engine จะแปลงเป็น javascript ได้ทันทีเมื่อโหลดเพจ สะดวกมากและเร็วกว่าที่คุณคิด อย่างไรก็ตามเอ็นจิ้น brython.js ที่คุณต้องรวมไว้ในเพจของคุณมีขนาดประมาณ 500Kb นอกจากนี้ยังมีเรื่องของการนำเข้าไลบรารีมาตรฐานซึ่ง Brython จัดการโดยการดึงไฟล์. js แยกต่างหากพร้อมคำขอ XHR libs บางตัวถูกคอมไพล์เป็น brython.js แล้วดังนั้นไม่ใช่ว่าการนำเข้าทุกครั้งจะดึงไฟล์ใหม่เข้ามา แต่ถ้าคุณใช้การนำเข้าจำนวนมากสิ่งต่างๆอาจช้า อย่างไรก็ตามมีวิธีรอบนี้ สิ่งที่ฉันทำคือตรวจสอบแท็บเครือข่ายในเครื่องมือ dev ของเบราว์เซอร์เพื่อดูว่าไฟล์ใดถูกดึงเข้าเมื่อโหลดหน้าจากนั้นลบไฟล์ทั้งหมดที่โครงการของฉันไม่ได้ใช้ในสำเนาของโฟลเดอร์ Brython src และเรียกใช้สคริปต์ที่มาพร้อมกับ Brython (ฉันคิดว่าเป็นที่ Brython / www / scripts / make_VFS.py) ที่รวบรวม libs ที่มีอยู่ทั้งหมดเป็นไฟล์เดียวที่เรียกว่า py_VFS.js ที่คุณต้องเชื่อมโยงจาก html ของคุณ โดยปกติมันจะสร้างไฟล์ขนาดใหญ่ 2MB + หนึ่งไฟล์ แต่ถ้าคุณลบสิ่งที่คุณไม่ได้ใช้มันอาจมีขนาดเล็กมาก การทำเช่นนี้หมายความว่าคุณต้องดึง brython.js, py_VFS.js และรหัส python ของคุณเท่านั้นและไม่จำเป็นต้องมีการร้องขอ XHR เพิ่มเติม
ในทางกลับกัน Transcrypt ( Github ) แจกจ่ายเป็นแพ็คเกจ python 3ที่คุณสามารถใช้ด้วยตนเองหรือเชื่อมต่อกับ toolchain ของคุณเพื่อรวบรวม python กับ javascript ไว้ล่วงหน้า ด้วย Transcrypt คุณจะเขียนด้วย python เรียกใช้ transcrypt กับ python และพ่นจาวาสคริปต์ที่คุณสามารถเชื่อมโยงไปยังโครงการของคุณได้ มันเป็นเหมือนคอมไพเลอร์แบบดั้งเดิมที่มีการควบคุมเอาต์พุตบางอย่าง ตัวอย่างเช่นคุณสามารถเลือกที่จะคอมไพล์เป็น ES6 หรือ ES5 หรือขอให้ส่งออกซอร์สแมป (ซึ่งในระหว่างการดีบักให้เบราว์เซอร์นำคุณไปยังรหัส python ที่เกี่ยวข้องโดยตรงในส่วนของรหัสจาวาสคริปต์ที่สร้างขึ้น) เอาต์พุตจาวาสคริปต์ของ Transcrypt นั้นค่อนข้างสั้น ( หรือพูดอีกอย่างก็สวยและสั้น) ในกรณีของฉัน 150kB ของ python ถูกแปลงเป็น 165kB ของจาวาสคริปต์ ES5 ที่ไม่มีการปิดกั้น จากการเปรียบเทียบโครงการของฉันเวอร์ชัน Brython ใช้ประมาณ 800Kb หลังจากการแปลง
อย่างไรก็ตามการจะได้รับประโยชน์จาก Transcrypts terseness นั้นจำเป็นต้องอ่านเอกสารสักหน่อย (จริงๆแค่นิดหน่อย) ตัวอย่างเช่นด้วย Transcrypt 'ความจริง' ของ Python สำหรับโครงสร้างข้อมูลเช่น dict, set และ list จะไม่ถูกเปิดใช้งานโดยค่าเริ่มต้นและการเปิดใช้งานทั่วโลกจะไม่ได้รับการสนับสนุนเนื่องจากปัญหาด้านประสิทธิภาพที่อาจเกิดขึ้นที่เกี่ยวข้องกับการตรวจสอบการพิมพ์ เพื่อความชัดเจน: ภายใต้ CPython คำสั่งที่ว่างเปล่าชุดหรือรายการมีค่าความจริงเป็นเท็จในขณะที่ใน Javascript ถือว่าเป็น 'จริง' .. ตัวอย่าง:
myList = []
if myList:
มีอย่างน้อยสามวิธีในการแก้ไขปัญหานี้:
- ใช้แฟล็ก -t เมื่อแปลง python เป็น javascript เช่น $ transcrypt -t python.py (ไม่แนะนำ แต่อาจไม่ใช่ปัญหาเว้นแต่คุณจะตรวจสอบความจริงหลายครั้งในโค้ดที่มีความละเอียดอ่อนด้านประสิทธิภาพ .. )
- ใช้
__pragma__(tconv)
หรือ__pragma__(notconv)
ภายในโค้ดของคุณเพื่อบอกให้คอมไพเลอร์ทรานสคริปต์เปิดการแปลงอัตโนมัติเป็นค่าความจริงแบบไพ ธ อนในเครื่อง
- แทนที่จะตรวจสอบค่าความจริงหลีกเลี่ยงปัญหาทั้งหมดโดยเพียงแค่ตรวจสอบ len (myList)> 0 ... บางทีนั่นอาจจะดีสำหรับสถานการณ์ส่วนใหญ่งานสำหรับการใช้งานเบาของฉัน
ถูกต้องดังนั้นโปรเจ็กต์ของฉันเริ่มใหญ่ขึ้นและฉันต้องการคอมไพล์ล่วงหน้าเพื่อเพิ่มประสิทธิภาพ แต่พบว่ามันยากที่จะทำเช่นนั้นกับ Brython (แม้ว่าจะเป็นไปได้ในทางเทคนิควิธีง่ายๆในการใช้โปรแกรมแก้ไขออนไลน์และคลิกปุ่มจาวาสคริปต์เพื่อดู ผลลัพธ์). ฉันทำเช่นนั้นและเชื่อมโยงกับ javascript ที่สร้างขึ้นจาก project.html แต่ไม่ได้ผลด้วยเหตุผลบางประการ นอกจากนี้ฉันพบว่ามันยากที่จะเข้าใจข้อความแสดงข้อผิดพลาดจาก Brython ดังนั้นฉันจึงไม่รู้ว่าจะเริ่มจากตรงไหนหลังจากขั้นตอนนี้ล้มเหลว นอกจากนี้ขนาดใหญ่ของรหัสที่ส่งออกและขนาดของเครื่องยนต์ brython ก็เริ่มรบกวนฉัน ดังนั้นฉันจึงตัดสินใจที่จะดู Transcrypt อย่างใกล้ชิดซึ่งในตอนแรกดูเหมือนจะเกรดสูงกว่าเพราะฉันชอบคำแนะนำที่โง่ลงซึ่งบอกวิธีเริ่มต้นทันที (ตั้งแต่นั้นมา)
สิ่งสำคัญในการตั้งค่าหลังจากติดตั้ง Python3.5 คือ:
- ใช้ venv (เป็นเหมือน Virtualenv เวอร์ชันใหม่ในตัวที่ใช้พื้นที่น้อยลงสำหรับแต่ละโปรเจ็กต์) เพื่อตั้งค่าโฟลเดอร์โปรเจ็กต์ python3.5 (เพียงพิมพ์: python3.5 -m venv foldername - วิธีแก้ปัญหาสำหรับ Ubuntu ที่มีปัญหาแพ็คเกจสำหรับ 3.5 ). สิ่งนี้ทำให้ 'ชื่อพับ' มีโฟลเดอร์ย่อย bin เหนือสิ่งอื่นใด
- ติดตั้งแพ็คเกจ Transcrypt python ด้วย pip ('foldername / bin / pip install transcrypt') ซึ่งจะติดตั้งลงใน foldername / lib / python3.5 / site-Packages / transcrypt
activate
เทอร์มินัลปัจจุบันหากคุณไม่ต้องการพิมพ์เส้นทางแบบเต็มไปยังชื่อพับ / bin / python3.5 ทุกครั้ง เปิดใช้งานโดยพิมพ์: 'source foldername / bin / enable'
- เริ่มเขียนโค้ดและรวบรวมลงในจาวาสคริปต์เพื่อทดสอบ คอมไพล์จากภายในโฟลเดอร์ที่คุณเขียนโค้ดตัวอย่างเช่นฉันใช้ชื่อพับ / www / project ดังนั้นซีดีลงในโฟลเดอร์นั้นแล้วเรียกใช้: 'transcrypt -b your_python_script.py'
__javascript__
ทำให้ว่าการส่งออกในโฟลเดอร์ย่อยที่เรียกว่า จากนั้นคุณสามารถเชื่อมโยงไปยังจาวาสคริปต์ที่ส่งออกมาจาก html ของคุณ
ประเด็นหลักที่กำลังดำเนินการอยู่
ฉันมีความต้องการที่ค่อนข้างง่ายดังนั้นระยะทางของคุณอาจแตกต่างกันไป
คุณต้องแทนที่ libs มาตรฐาน brython หรือ python ด้วย javascript libs ตัวอย่างเช่น 'import json' จัดทำโดย Brython แต่ภายใต้ Transcrypt คุณสามารถใช้ javascript lib หรือใช้ JSON.parse / JSON.stringify โดยตรงในโค้ด Python ของคุณ หากต้องการรวมไลบรารี javascript เวอร์ชันย่อลงในโค้ด python ของคุณโดยตรงให้ใช้รูปแบบนี้ (สังเกตเครื่องหมายอัญประกาศสาม):
__pragma__ ('js', '{}', '''
// javascript code
''')
ฟังก์ชั่นเฉพาะ html ของ Brython ไม่ทำงานกับ Transcrypt อย่างเห็นได้ชัด เพียงใช้จาวาสคริปต์ตามปกติ ตัวอย่าง: 1) ภายใต้ Brython คุณอาจอ้างถึงแท็ก HTML ที่เฉพาะเจาะจงโดยใช้ "document ['id']" แต่หากใช้ Transcrypt คุณจะใช้ "document.getElementById ('id') (ซึ่งเป็นวิธีเดียวกับที่คุณทำ จากจาวาสคริปต์) 2) คุณไม่สามารถลบโหนดด้วย 'del nodeName' (bcs นั่นคือฟังก์ชัน brython) ใช้บางอย่างเช่น 'node.parentNode.removeChild (node)' 3) แทนที่ฟังก์ชัน DOM ทั้งหมดของ brython ด้วยทางเลือกของจาวาสคริปต์ เช่น class_name = className; ข้อความ = textContent; html = innerHTML; parent = parentNode; children = childNodes เป็นต้นฉันเดาว่าหากคุณต้องการสิ่งที่มีทางเลือกอื่นที่จำเป็นสำหรับเบราว์เซอร์รุ่นเก่าบางตัวก็มีไลบรารีจาวาสคริปต์สำหรับสิ่งนั้น 4) set_timeout ของ Brython ถูกแทนที่ด้วย javascripts setTimeout 5) ต้องเปลี่ยนแท็ก html ของ Brython เช่น BR () โดยใช้วิธีจาวาสคริปต์ปกติรวมถึงการทำซ้ำทุกที่ที่คุณใช้มันเป็นไวยากรณ์การจัดการ <= dom ฉีดมาร์กอัปข้อความธรรมดาเป็น innerHTML หรือสร้างองค์ประกอบโดยใช้ไวยากรณ์ javascript แล้วแนบโดยใช้ไวยากรณ์ javascript DOM ปกติ ฉันสังเกตว่าสำหรับช่องทำเครื่องหมาย brython ใช้ "if checkbox = 'checked':" แต่ Transcrypt พอใจกับ "if checkbox:" .. ฉีดมาร์กอัปข้อความธรรมดาเป็น innerHTML หรือสร้างองค์ประกอบโดยใช้ไวยากรณ์ javascript แล้วแนบโดยใช้ไวยากรณ์ javascript DOM ปกติ ฉันสังเกตว่าสำหรับช่องทำเครื่องหมาย brython ใช้ "if checkbox = 'checked':" แต่ Transcrypt พอใจกับ "if checkbox:" .. ฉีดมาร์กอัปข้อความธรรมดาเป็น innerHTML หรือสร้างองค์ประกอบโดยใช้ไวยากรณ์ javascript แล้วแนบโดยใช้ไวยากรณ์ javascript DOM ปกติ ฉันยังสังเกตเห็นว่าสำหรับช่องทำเครื่องหมาย brython ใช้ "if checkbox = 'checked':" แต่ Transcrypt พอใจกับ "if checkbox:" ..
ฉันเสร็จสิ้นการย้ายโครงการสาย 2700 ในสัปดาห์ที่แล้วซึ่งในเวลานั้น Transcrypt ไม่ได้รับการสนับสนุนสำหรับสิ่งเล็กน้อยบางอย่าง (แม้ว่าจะง่ายพอที่จะแทนที่ด้วยฟิลเลอร์) แต่สิ่งเหล่านี้คือ 1) str.lower, str.split (str. การแยกมีอยู่ แต่ดูเหมือนว่าจะเป็นการแยกจาวาสคริปต์ซึ่งทำงานแตกต่างจากเวอร์ชัน python พฤติกรรมที่ฉันอาศัยอยู่) 2) รอบ (ดูเหมือนว่าจะได้รับการสนับสนุนในเวอร์ชัน dev ในขณะนี้) และ 3) isinstance ไม่ ไม่ทำงานกับ str, int และ float เฉพาะใน dict, list และ set 4) ข้อแตกต่างจาก Brython ที่ฉันสังเกตเห็นก็คือถ้าฉันดึงการแสดง JSON ของ dict ฉันต้องทำเช่นนั้นโดยใช้ 'myDict = dict (data)' ในขณะที่ brython พอใจกับ 'myDict = data' แต่นั่นอาจเกี่ยวข้องกับบางอย่างใน json.loads ของ Brython ซึ่งฉันแทนที่โดยตรงด้วย JSON.parse__pragma__('opov')
สำหรับท้องถิ่น) คุณไม่สามารถทำสิ่งต่างๆเช่นตั้งค่าการดำเนินการโดยใช้รูปแบบที่โอเวอร์โหลด แต่จำเป็นต้องใช้ฟังก์ชันที่เกี่ยวข้อง เช่น
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) นอกจากนี้คุณไม่สามารถวนซ้ำคำสั่งตามค่าเริ่มต้นโดยใช้ 'for i in dict:' โดยไม่เปิดใช้งาน (cmd line -i หรือ__pragma__('iconv')
แต่คุณสามารถหลีกเลี่ยงการเปิดใช้งานได้โดยใช้สมาชิกคีย์ () เช่น:
for key, value in dict.items():
เพื่อสรุป
ฉันชอบ Brython เพราะมันง่ายที่จะไปกับมันและทดสอบโค้ดของคุณ (แค่ F5) ใกล้เคียงกับ python จริงมากขึ้นเพราะ lib มาตรฐานส่วนใหญ่อยู่ที่นั่น ฉันไม่ชอบที่จะต้องรวมกลไกการถ่ายโอนข้อมูล (แก้ไข: หรืออาจมองว่าเป็น python VM) ในเบราว์เซอร์และขนาดจาวาสคริปต์ที่ขยายใหญ่ออกไป ถ้าฉันต้องทำสิ่งต่าง ๆ (แต่ยังคงใช้ Brython) ฉันจะใช้วิธีการจาวาสคริปต์เพื่อจัดการ DOM จาก brython (ซึ่งคุณสามารถทำได้ .. ) แทนที่จะใช้วิธี brython มากเพราะเสียเวลาในการย้ายข้าม ไปยังเครื่องถ่ายโอนข้อมูลอื่นเมื่อความต้องการของฉันเปลี่ยนไป
ฉันชอบ Transcrypt เพราะจาวาสคริปต์ที่ส่งออกมานั้น 'ลีนและมีความหมาย' จริงๆและเนื่องจากสิ่งเดียวที่คุณโหลดฝั่งเบราว์เซอร์คือโค้ดจาวาสคริปต์ที่คุณสร้างขึ้นซึ่งมีขนาดใกล้เคียงกับโค้ดไพ ธ อนของคุณ ด้วยเพราะมันรองรับซอร์สแมปและเนื่องจากมันทำให้ฉันสามารถควบคุมจาวาสคริปต์ที่ส่งออกมาได้ และการใช้มันสอนฉันค่อนข้างน้อยเกี่ยวกับการเพิ่มประสิทธิภาพ
หวังว่าจะช่วยให้ใครบางคนเห็นว่าสิ่งใดที่อาจดีสำหรับโครงการเฉพาะของพวกเขา