Ось деяка інформація про Brython vs Transcrypt (липень 2016 р., Оскільки Transcrypt була додана як опція з цього питання ОП), отримана запуском проекту з Brython кілька місяців тому та переходом до Transcrypt (завершено переміщення минулого тижня). Мені подобаються Brython і Transcrypt, і я бачу, як їх використовувати.
Для людей, які не знайомі з цим, Brython і Transcrypt обидва вводять python-переклад у javascript (Редагувати: можливо, краще розглядати Brython як `` реалізацію Python для браузера '', оскільки він не створює автономний javascript). Для обох потрібен синтаксис Python 3. Brython включає значну кількість стандартних бібліотек Python, і деякі з них є власними для роботи з речами, пов'язаними з Інтернетом, тоді як Transcrypt здебільшого уникає цього і пропонує замість цього використовувати бібліотеки Javascript.
Брайтон ( Github) може здійснити перетворення в браузері. Отже, ви пишете на python, і механізм brython.js перетворює його в javascript на льоту, коли сторінка завантажується. Це дійсно зручно і набагато швидше, ніж ви можете подумати. Однак движок brython.js, який потрібно включити на свої сторінки, становить близько 500 Кб. Також є питання імпорту стандартних бібліотек, які Brython обробляє, отримуючи окремі файли .js із запитами XHR. Деякі бібліотеки вже скомпільовані у brython.js, тому не кожен імпорт притягуватиме нові файли, але якщо ви використовуєте багато імпорту, все може ставати повільним. Однак є способи обійти це. Що я зробив, це перевірив вкладку мережі в інструментах розробника браузера, щоб побачити, які файли втягуються під час завантаження сторінки, а потім видалити всі файли, які мій проект не використовував, у копії папки Brython src, і запустіть скрипт, що входить до складу Brython (я думаю, що це на Brython / www / scripts / make_VFS.py), який компілює всі доступні бібліотеки в один файл під назвою py_VFS.js, на який вам також потрібно зробити посилання з вашого html. Зазвичай він створює один величезний файл розміром 2 Мб +, але якщо ви видалите те, чим не користуєтесь, він може бути зовсім маленьким. Роблячи це таким чином, означає, що вам потрібно лише втягнути brython.js, py_VFS.js та ваш код python, і ніяких додаткових запитів XHR не буде потрібно.
З іншого боку, Transcrypt ( Github ) розповсюджується як пакет python 3що ви можете використовувати вручну або підключити до вашої ланцюжка інструментів, щоб заздалегідь скомпілювати python у javascript. Отже, у Transcrypt ви пишете на python, запускаєте транскрипцію проти python, і він випльовує javascript, на який ви можете посилатись у своєму проекті. Це більше схоже на традиційний компілятор ще й тим, що він пропонує певний контроль над вихідними даними. Наприклад, ви можете вибрати компіляцію до ES6 або ES5, або попросити її вивести вихідні карти (щоб під час налагодження давайте браузер переводив вас безпосередньо до відповідного коду python, замість згенерованого коду javascript.) Вивід javascript Transcrypt досить стислий ( або по-іншому, це досить і стисло). У моєму випадку 150 кБ пітона перетворюється на 165 кБ немініфікованого javascript ES5. Для порівняння, версія Brython мого проекту використовувала близько 800 Кб після перетворення.
Однак, щоб отримати переваги лаконічності Transcrypts, потрібно трохи прочитати документи (насправді лише трохи). Наприклад, у Transcrypt `` правдивість '' Python для таких структур даних, як dict, set та list, не ввімкнена за замовчуванням, і глобально це не рекомендується через можливі проблеми з продуктивністю, пов'язані з перевіркою типу. Для наочності: під CPython порожній дикт, набір або список має значення істини False, тоді як у Javascript це вважається "істинним". Приклад:
myList = []
if myList:
Є щонайменше три способи вирішення цієї проблеми:
- Використовуйте прапорець -t під час перетворення python у javascript, наприклад: $ transcrypt -t python.py (не рекомендується, але, мабуть, не є проблемою, якщо ви не перевіряєте правдивість багато разів у внутрішніх циклах коду, чутливого до продуктивності ..)
- Використовуйте
__pragma__(tconv)
або __pragma__(notconv)
всередині вашого коду, щоб сказати компілятору транскрипту локально ввімкнути автоматичне перетворення в значення істини, схожі на пітон.
- Замість того, щоб перевіряти значення істини, уникніть проблеми взагалі, просто перевіривши len (myList)> 0 ... Можливо, це буде добре для більшості ситуацій, це робить роботу для мого легкого використання.
Так, отже, мій проект ставав більшим, і я хотів попередньо скомпілювати для підвищення продуктивності, але мені було важко зробити це з Brython (хоча це технічно можливо, простий спосіб полягає у використанні онлайн-редактора та натисканні кнопки javascript, щоб вихід). Я зробив це і зв’язав згенерований javascript з project.html, але з якихось причин це не спрацювало. Крім того, мені важко зрозуміти повідомлення про помилки від Brython, тому я не знав, з чого почати після того, як цей крок не вдався. Крім того, великий розмір коду, що виводиться, та розмір движка brython починали мене хвилювати. Тож я вирішив уважніше розглянути Transcrypt, який спочатку здавався вищим, оскільки я віддаю перевагу сформованим інструкціям, які говорять мені, як негайно розпочати роботу (з тих пір вони були додані).
Головне, щоб налаштувати його після встановлення Python3.5:
- Використовуйте venv (це як нова вбудована версія virtualenv, яка використовує менше місця для кожного проекту), щоб створити папку проекту python3.5 (просто введіть: python3.5 -m назва папки venv - обхідне рішення для ubuntu з проблемами з пакетом для 3.5 ). Це, серед іншого, робить "ім'я папки" із підпапкою bin.
- Встановіть пакет Transcrypt python за допомогою pip ('ім'я папки / bin / pip install transcrypt'), який встановлює його в папкуname / lib / python3.5 / site-пакети / transcrypt.
activate
поточний термінал, якщо ви не хочете щоразу вводити повний шлях до імені папки / bin / python3.5. Активуйте, набравши: 'ім'я вихідної папки / смітник / активувати'
- Почніть писати код і складати його в javascript для тестування. Компілюйте з папки, в якій ви пишете свій код. Наприклад, я використовував ім’я папки / www / project. Отже, компакт-диск у цю папку та запустіть: 'transcrypt -b your_python_script.py'. Це виводить вихід у підпапку з назвою
__javascript__
. Потім ви можете зробити посилання на вихідний javascript із вашого html.
Основні проблеми, що рухаються поперек
У мене досить прості потреби, тому ваш пробіг може відрізнятися.
Вам потрібно замінити стандартні бібліотеки brython або python на бібліотеки javascript. Так, наприклад, `` імпорт json '' надається Brython, але в Transcrypt ви можете використовувати javascript lib або просто використовувати JSON.parse / JSON.stringify безпосередньо у коді Python. Щоб включити мінімізовану версію бібліотеки javascript безпосередньо до коду python, використовуйте цей формат (зверніть увагу на потрійні лапки):
__pragma__ ('js', '{}', '''
// javascript code
''')
Специфічні для HTML функції Brython не працюють з Transcrypt, очевидно. Просто використовуйте звичайні способи JavaScript. Приклади: 1) під Brython ви могли посилатися на певний HTML-тег, використовуючи 'document [' id ']', але з Transcrypt ви б використовували 'document.getElementById (' id ') (що відбувається так само, як і ви це з javascript). 2) Ви не можете видалити вузол із 'del nodeName' (bcs - це функція brython). Використовуйте щось на зразок 'node.parentNode.removeChild (node)'. 3) замінити всі функції DOM brython на альтернативні варіанти javascript. напр. ім'я класу = Ім'я класу; text = textContent; html = innerHTML; parent = parentNode; діти = дочірні вузли тощо. Я думаю, якщо вам потрібно щось, що містить альтернативи, необхідні деяким старим браузерам, тоді для цього існують бібліотеки javascript. 4) set_timeout Brython замінено на javascripts setTimeout 5) HTML-теги Brython, такі як BR (), потрібно замінити, використовуючи звичайні способи javascript, а також переробляти будь-які місця, які ви використовували, це синтаксис маніпуляції <= dom. Або вставте розмітку простого тексту як innerHTML, або зробіть елементи, використовуючи синтаксис javascript, а потім додайте їх, використовуючи звичайний синтаксис DOM javascript. Я також помітив, що для прапорців brython використовує "if checkbox = 'check':", але Transcrypt задоволений "if checkbox:" .. Або вставте розмітку простого тексту як innerHTML, або зробіть елементи, використовуючи синтаксис javascript, а потім вкладіть їх, використовуючи звичайний синтаксис DOM javascript. Я також помітив, що для прапорців brython використовує "if checkbox = 'check':", але Transcrypt задоволений "if checkbox:" .. Або вставте розмітку простого тексту як innerHTML, або зробіть елементи, використовуючи синтаксис javascript, а потім вкладіть їх, використовуючи звичайний синтаксис DOM javascript. Я також помітив, що для прапорців brython використовує "if checkbox = 'check':", але Transcrypt задоволений "if checkbox:" ..
За минулий тиждень я закінчив перенесення проекту лінії 2700, тоді Transcrypt не мав підтримки для декількох незначних речей (хоча їх було досить легко замінити наповнювачами), це були 1) str.lower, str.split (str. split присутній, але, схоже, це розділення javascript, яке працює інакше, ніж версія python, на поведінку якої я покладався), 2) кругла (це, мабуть, підтримується у версії розробника) та 3) isinstance didn не працюю на str, int та float, лише на dict, list та set. 4) Ще однією відмінністю від Brython, яку я помітив, є те, що якщо я втягую JSON-представлення dict, мені потрібно це зробити, використовуючи 'myDict = dict (дані)', тоді як 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 or __pragma__('iconv')
, але ви можете уникнути необхідності вмикати його, просто використовуючи елемент keys (), наприклад:
for key, value in dict.items():
Підсумовувати
Мені подобається Brython, тому що з ним легко почати і тестувати свій код (просто F5). Це ближче до справжнього python, оскільки там знаходиться більшість стандартних бібліотек. Мені не подобається включати механізм транпіляції (Редагувати: Або можна розглядати його як python VM) у браузері та великий розмір виведеного javascript. Якби мені довелося щось робити (але все-таки використовуючи Brython), я б використав методи javascript для маніпулювання DOM з brython (що ви можете зробити ..), замість того, щоб стільки спиратися на методи brython, оскільки це марно витрачений час на пересування до іншого перетворювача, коли мої потреби змінилися.
Мені подобається Transcrypt, оскільки виведений javascript насправді є «худим і підлим» і тому, що єдине, що ви завантажуєте з боку браузера, - це ваш згенерований код JavaScript, який за розміром схожий на ваш код python. Також тому, що він підтримує вихідні карти та тому, що це дає мені певний контроль над виведеним javascript. І його використання навчило мене трохи про оптимізацію.
Сподіваюся, це допоможе комусь зрозуміти, що з цього може підійти для конкретного проекту.