【安裝:pip install ulang,用法與例程請見 PyPI。源碼位于開源中國(文末鏈接)。 需 Python 3.7,源碼文件需 UTF-8 編碼】
本周發(fā)布木蘭編程語言版本 0.0.14.8。將 Python 框架 tornado自帶的用 WebSocket 實現(xiàn)聊天的例程改為木蘭實現(xiàn)。順便將該例程涉及的木蘭與 Python 語法對比小結(jié),包括本周重現(xiàn)的 super 語法等。
1 實例演示
主要木蘭代碼如下(完整代碼見源碼庫)
type 聊天渠道 : tornado.websocket.WebSocketHandler { { 接收端 = set() 歷史 = [] 歷史長度 = 200 } func $get_compression_options { // Non-None enables compression with default options. return {:} } func $open { 聊天渠道.接收端.add($) } func $on_close { 聊天渠道.接收端.remove($) } func 更新歷史(消息) { // 必須指定類 聊天渠道.歷史.append(消息) if len(聊天渠道.歷史) > 聊天渠道.歷史長度 { 聊天渠道.歷史 = 聊天渠道.歷史[-聊天渠道.歷史長度 :] } } func 廣播(消息) { logging.info("發(fā)到%d個接收端", len(聊天渠道.接收端)) for 某接收端 in 聊天渠道.接收端 { // TODO: try catch 尚待重現(xiàn) //try: 某接收端.write_message(消息) //except: // logging.error("Error sending message", exc_info=True) } } func $on_message(內(nèi)容) { logging.info("收到消息: %r", 內(nèi)容) parsed = tornado.escape.json_decode(內(nèi)容) 消息 = {"id": str(uuid.uuid4()), "body": parsed["body"]} 消息["html"] = tornado.escape.to_basestring( $render_string("message.html", message=消息) ) 聊天渠道.更新歷史(消息) 聊天渠道.廣播(消息) }}
2 與例程涉及的 Python 語法對比
下面都基于當(dāng)前對木蘭的認(rèn)識,今后隨重現(xiàn)項目進(jìn)展可能修改
必須(否則報錯)
- 如碰到形參的關(guān)鍵詞為 type,需改為位置形參。如原始例程中的:
define("port", default=8888, help="run on the given port", type=int)
最后一個形參的 keyword 為 type,正好是木蘭的語法關(guān)鍵詞。因此只能改為位置形參(順便中文化封裝):
func 定義(名稱 : str, 默認(rèn)=nil, 類型=nil, 幫助=nil) { define(名稱, 默認(rèn), 類型, 幫助)}定義("port", 默認(rèn)=8888, 幫助="在此端口運(yùn)行服務(wù)", 類型=int)
- 木蘭只有靜態(tài)方法(staticmethod)。碰到 Python 的 classmethod 時,引用類變量時用類名取代 cls。見上面的 更新歷史 方法。
- 需 tuple() 初始化元組,見前文介紹
- 所有塊改為 {},取代 Python 中的冒號
- class 變 type,用冒號指定類型,包括指定形參類型、超類等
- 注釋段用 /* */,注釋行用 //
- import 變 using
- None 變 nil
- def 變 func
- 【本周】super() 變 super
- 【本周】不支持 **,改用列舉形參
- 類變量需用{}包圍
- 字典初始化 {:}
可選
- self 變 $,見前文介紹
- 構(gòu)造函數(shù)用類名而非__init__
- 無參數(shù)函數(shù)定義時可省略 ()
附:代碼量統(tǒng)計
主要部分的代碼行數(shù)統(tǒng)計,格式為:上次->現(xiàn)在。
- 木蘭代碼量 2965 -> 3114
- 編輯器,實現(xiàn)與測試都是木蘭代碼:432 -> 431 (在為分為前后端實現(xiàn)調(diào)研網(wǎng)絡(luò)服務(wù)框架)
- 木蘭測試用例,包括部分實用小程序(如井字棋):2533 -> 2683
- Python 代碼量(木蘭實現(xiàn)與測試框架):2594 -> 2612
- 分析器/語法分析器.py:1008 -> 1019
- 分析器/詞法分析器.py:204 -> 207
- 測試/運(yùn)行所有.py,檢驗所有木蘭測試代碼片段:192 -> 194
- 環(huán)境.py,定義全局方法:171 -> 172
- 分析器/語法成分.py,從語法分析器中提取出來的枚舉常量:81 -> 82
- 功用/反饋信息.py:65 -> 67
- 測試/unittest/語法樹.py,確保生成的語法樹與原始版本一致:67 -> 66
- 未變
- 分析器/語法樹.py:202
- 交互.py,交互環(huán)境(REPL):138
- 中.py,主程序:74
- 功用/調(diào)試輔助.py,:57
- setup.py, 34
- 分析器/錯誤.py:17
- 測試/unittest/交互.py,交互環(huán)境相關(guān)測試:28
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。