Đây là một số thông tin về Brython vs Transcrypt (tháng 7 năm 2016, vì Transcrypt đã được OP thêm vào làm tùy chọn cho câu hỏi này), thu thập được bằng cách bắt đầu một dự án với Brython vài tháng trước và chuyển sang Transcrypt (đã hoàn thành việc chuyển vào tuần trước). Tôi thích Brython và Transcrypt và có thể thấy công dụng của cả hai.
Đối với những người chưa quen với điều này, Brython và Transcrypt đều 'chuyển đổi' đầu vào python thành javascript (Chỉnh sửa: có lẽ tốt hơn nên xem Brython là 'triển khai Python cho trình duyệt' vì nó không tạo ra javascript độc lập). Cả hai đều yêu cầu cú pháp Python 3. Brython bao gồm một số lượng đáng kể các thư viện chuẩn Python và một số thư viện riêng để xử lý những thứ liên quan đến web, trong khi Transcrypt tránh điều đó phần lớn và đề xuất sử dụng các thư viện Javascript để thay thế.
Brython ( Github) có thể thực hiện chuyển đổi trong trình duyệt. Vì vậy, bạn viết bằng python và công cụ brython.js chuyển đổi nó thành javascript ngay lập tức khi trang được tải. Điều này thực sự tiện lợi và nhanh hơn nhiều so với những gì bạn nghĩ. Tuy nhiên, công cụ brython.js mà bạn cần đưa vào các trang của mình là khoảng 500Kb. Ngoài ra, có vấn đề về việc nhập các thư viện chuẩn, mà Brython xử lý bằng cách tìm nạp các tệp .js riêng biệt với các yêu cầu XHR. Một số lib đã được biên dịch thành brython.js, vì vậy không phải mọi lần nhập sẽ kéo theo các tệp mới, nhưng nếu bạn sử dụng nhiều lần nhập, mọi thứ có thể trở nên chậm chạp. Tuy nhiên, có nhiều cách để giải quyết vấn đề này. Những gì tôi đã làm là kiểm tra tab mạng trong các công cụ dành cho nhà phát triển trình duyệt để xem tệp nào đang được kéo vào khi trang được tải, sau đó xóa tất cả các tệp mà dự án của tôi không sử dụng trong bản sao của thư mục Brython src, và chạy tập lệnh đi kèm với Brython (tôi nghĩ đó là ở Brython / www / scripts / make_VFS.py) biên dịch tất cả các lib có sẵn thành một tệp có tên py_VFS.js mà bạn cũng cần liên kết đến từ html của mình. Thông thường, nó sẽ tạo ra một tệp lớn hơn 2MB, nhưng nếu bạn xóa những thứ bạn không sử dụng, nó có thể khá nhỏ. Làm theo cách này, có nghĩa là bạn chỉ cần kéo brython.js, py_VFS.js và mã python của bạn và không cần yêu cầu XHR bổ sung.
Mặt khác, Transcrypt ( Github ) được phân phối dưới dạng gói python 3mà bạn có thể sử dụng theo cách thủ công hoặc móc vào chuỗi công cụ của mình để biên dịch trước python sang javascript. Vì vậy, với Transcrypt, bạn viết bằng python, chạy transcrypt đối với python và nó tạo ra javascript mà bạn có thể liên kết đến trong dự án của mình. Nó giống một trình biên dịch truyền thống hơn ở chỗ nó cung cấp một số quyền kiểm soát đầu ra. Ví dụ: bạn có thể chọn biên dịch sang ES6 hoặc ES5 hoặc yêu cầu nó xuất ra các bản đồ nguồn (trong quá trình gỡ lỗi, trình duyệt sẽ đưa bạn trực tiếp đến mã python tương ứng, bên trong mã javascript được tạo.) Đầu ra javascript của Transcrypt khá ngắn ( hay nói một cách khác, nó đẹp và ngắn gọn). Trong trường hợp của tôi, 150kB python được chuyển đổi thành 165kB của javascript ES5 chưa hợp nhất. Để so sánh, phiên bản Brython trong dự án của tôi đã sử dụng khoảng 800Kb sau khi chuyển đổi.
Tuy nhiên, để có được những lợi ích của Transcrypts terseness, đòi hỏi bạn phải đọc tài liệu một chút (thực sự chỉ là một chút). Ví dụ: với Transcrypt, tính năng 'truthiness' của Python cho các cấu trúc dữ liệu như dict, set và list không được bật theo mặc định và việc bật toàn cầu không được khuyến khích vì các vấn đề hiệu suất tiềm ẩn liên quan đến đánh máy. Để rõ ràng: Trong CPython, một mệnh đề, tập hợp hoặc danh sách trống có giá trị true là False, trong khi trong Javascript nó được coi là 'true' .. Ví dụ:
myList = []
if myList:
Có ít nhất ba cách để giải quyết vấn đề này:
- Sử dụng cờ -t khi chuyển đổi python thành javascript, ví dụ: $ transcrypt -t python.py (không được khuyến nghị, nhưng có lẽ không phải là vấn đề trừ khi bạn kiểm tra độ tin cậy nhiều lần trong các vòng lặp bên trong của mã nhạy cảm về hiệu suất ..)
- Sử dụng
__pragma__(tconv)
hoặc __pragma__(notconv)
trong mã của bạn để yêu cầu trình biên dịch mã hóa chuyển đổi tự động sang các giá trị sự thật giống python cục bộ.
- Thay vì kiểm tra giá trị chân lý, hãy tránh hoàn toàn vấn đề bằng cách chỉ kiểm tra len (myList)> 0 ... Có lẽ điều đó sẽ ổn cho hầu hết các trường hợp, thực hiện công việc đối với việc sử dụng ánh sáng của tôi.
Đúng vậy, vì vậy dự án của tôi ngày càng lớn hơn và tôi muốn biên dịch trước để tăng hiệu suất nhưng cảm thấy khó làm như vậy với Brython (mặc dù về mặt kỹ thuật thì có thể, một cách dễ dàng là sử dụng trình chỉnh sửa trực tuyến và nhấp vào nút javascript để xem đầu ra). Tôi đã làm điều đó và liên kết với javascript được tạo từ project.html nhưng nó không hoạt động vì một số lý do. Ngoài ra, tôi cảm thấy khó hiểu các thông báo lỗi từ Brython nên tôi không biết bắt đầu từ đâu sau khi bước này không thành công. Ngoài ra, kích thước lớn của mã được xuất ra và kích thước của công cụ brython đã bắt đầu gây khó chịu cho tôi. Vì vậy, tôi quyết định xem xét kỹ hơn Transcrypt, thoạt đầu có vẻ như là cao cấp hơn vì tôi thích các hướng dẫn được rút ra cho tôi biết cách bắt đầu ngay lập tức (những hướng dẫn này đã được thêm vào).
Điều chính để thiết lập nó sau khi cài đặt Python3.5 là:
- Sử dụng venv (nó giống như phiên bản virtualenv tích hợp mới sử dụng ít dung lượng hơn cho mỗi dự án) để thiết lập thư mục dự án python3.5 (chỉ cần nhập: tên thư mục python3.5 -m venv - giải pháp thay thế cho ubuntu với các vấn đề về gói cho 3.5 ). Điều này làm cho 'tên thư mục' với một thư mục con bin trong số những thứ khác.
- Cài đặt gói python Transcrypt bằng pip ('foldername / bin / pip install transcrypt') sẽ cài đặt nó vào tên thư mục / lib / python3.5 / site-pack / transcrypt.
activate
thiết bị đầu cuối hiện tại nếu bạn không muốn phải nhập đường dẫn đầy đủ đến tên thư mục / bin / python3.5 mỗi lần. Kích hoạt bằng cách nhập: 'tên thư mục nguồn / bin / kích hoạt'
- Bắt đầu viết mã và biên dịch nó sang javascript để thử nghiệm. Biên dịch từ trong thư mục mà bạn viết mã vào. Ví dụ: tôi đã sử dụng tên thư mục / www / project. Vì vậy, CD vào thư mục đó và chạy: 'transcrypt -b your_python_script.py'. Điều đó đặt đầu ra trong một thư mục con được gọi
__javascript__
. Sau đó, bạn có thể liên kết đến javascript được xuất ra từ html của bạn.
Các vấn đề chính liên quan
Tôi có nhu cầu khá đơn giản, vì vậy số dặm của bạn có thể thay đổi.
Bạn cần thay thế lib chuẩn brython hoặc python bằng lib javascript. Vì vậy, ví dụ: 'import json' được cung cấp bởi Brython, nhưng trong Transcrypt, bạn có thể sử dụng javascript lib hoặc chỉ sử dụng JSON.parse / JSON.stringify trực tiếp trong mã Python của bạn. Để bao gồm phiên bản rút gọn của thư viện javascript trực tiếp trong mã python của bạn, hãy sử dụng định dạng này (lưu ý ba dấu ngoặc kép):
__pragma__ ('js', '{}', '''
// javascript code
''')
Các chức năng cụ thể trong html của Brython rõ ràng không hoạt động với Transcrypt. Chỉ cần sử dụng các cách javascript thông thường. Ví dụ: 1) trong Brython, bạn có thể đã tham chiếu đến một thẻ HTML cụ thể bằng cách sử dụng 'document [' id ']', nhưng với Transcrypt, bạn sẽ sử dụng 'document.getElementById (' id ') (giống như cách bạn làm nó từ javascript). 2) Bạn không thể xóa một nút bằng 'del nodeName' (bcs đó là một hàm brython). Sử dụng một cái gì đó như 'node.parentNode.removeChild (node)'. 3) thay thế tất cả các hàm DOM của brython bằng các lựa chọn thay thế javascript. ví dụ: class_name = className; text = textContent; html = innerHTML; cha = parentNode; children = childNodes, v.v. Tôi đoán nếu bạn cần thứ gì đó có chứa các lựa chọn thay thế được yêu cầu bởi một số trình duyệt cũ hơn thì có các thư viện javascript cho điều đó. 4) Set_timeout của Brython được thay thế bằng javascripts setTimeout 5) Các thẻ html của Brython như BR () cần được thay thế bằng cách sử dụng các cách javascript thông thường cũng như làm lại bất kỳ chỗ nào bạn đã sử dụng cú pháp thao tác <= dom. Chèn đánh dấu văn bản thuần túy dưới dạng innerHTML hoặc tạo các phần tử bằng cú pháp javascript và sau đó đính kèm chúng bằng cú pháp DOM javascript thông thường. Tôi cũng nhận thấy rằng đối với các hộp kiểm, brython sử dụng "if checkbox = 'check':" nhưng Transcrypt hài lòng với "if checkbox:" .. Chèn đánh dấu văn bản thuần túy dưới dạng innerHTML hoặc tạo các phần tử bằng cú pháp javascript rồi đính kèm chúng bằng cú pháp DOM javascript thông thường. Tôi cũng nhận thấy rằng đối với các hộp kiểm, brython sử dụng "if checkbox = 'check':" nhưng Transcrypt hài lòng với "if checkbox:" .. Chèn đánh dấu văn bản thuần túy dưới dạng innerHTML hoặc tạo các phần tử bằng cú pháp javascript rồi đính kèm chúng bằng cú pháp DOM javascript thông thường. Tôi cũng nhận thấy rằng đối với các hộp kiểm, brython sử dụng "if checkbox = 'check':" nhưng Transcrypt hài lòng với "if checkbox:" ..
Tôi đã hoàn thành dự án 2700 line vào tuần trước, lúc đó Transcrypt không có hỗ trợ cho một số thứ nhỏ (mặc dù chúng đủ dễ dàng để thay thế bằng chất độn), đây là 1) str.lower, str.split (str. split hiện có, nhưng dường như là phân tách javascript, hoạt động khác với phiên bản python, hành vi mà tôi đang dựa vào), 2) round (điều này dường như được hỗ trợ trong phiên bản dev bây giờ) và 3) isinstance didn 'không hoạt động trên str, int và float, chỉ trên dict, list và set. 4) Một điểm khác biệt khác so với Brython mà tôi nhận thấy là nếu tôi lấy biểu diễn JSON của một dict, tôi cần làm như vậy bằng cách sử dụng 'myDict = dict (data)', trong khi brython hài lòng với 'myDict = data'. Nhưng điều đó có thể liên quan đến thứ gì đó trong json.loads của Brython, mà tôi đã thay thế trực tiếp bằng JSON.parse.__pragma__('opov')
cho cục bộ), bạn không thể thực hiện những việc như thiết lập các hoạt động bằng cách sử dụng định dạng được nạp chồng, nhưng cần sử dụng các chức năng tương ứng. Ví dụ
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) Ngoài ra, bạn không thể lặp lại các di lệnh theo mặc định bằng cách sử dụng 'for i in dict:', mà không bật điều đó (cmd dòng -i hoặc __pragma__('iconv')
, nhưng bạn có thể tránh phải bật nó bằng cách chỉ sử dụng thành viên key (), ví dụ:
for key, value in dict.items():
Để tóm tắt
Tôi thích Brython vì nó dễ dàng làm quen và kiểm tra mã của bạn (chỉ cần F5). Nó gần giống với trăn thật vì hầu hết các lib tiêu chuẩn đều ở đó. Tôi không thích phải bao gồm công cụ chuyển đổi (Chỉnh sửa: Hoặc người ta có thể xem nó như một máy ảo python) trong trình duyệt và kích thước javascript đầu ra lớn. Nếu tôi phải làm lại mọi thứ (nhưng vẫn sử dụng Brython), tôi sẽ sử dụng các phương thức javascript để thao tác DOM từ brython (mà bạn có thể làm ..), thay vì dựa nhiều vào các phương pháp brython vì điều đó lãng phí thời gian di chuyển sang một trình vận chuyển khác khi nhu cầu của tôi thay đổi.
Tôi thích Transcrypt vì javascript được xuất ra thực sự 'gọn gàng và có ý nghĩa' và bởi vì thứ duy nhất bạn tải phía trình duyệt là mã javascript được tạo của bạn có kích thước tương tự như mã python của bạn. Cũng bởi vì nó hỗ trợ bản đồ nguồn và vì nó cung cấp cho tôi một biện pháp kiểm soát đối với javascript được xuất ra. Và việc sử dụng nó đã dạy tôi khá nhiều về tối ưu hóa.
Hy vọng điều đó sẽ giúp ai đó thấy cái nào trong số này có thể tốt cho dự án cụ thể của họ.