【安装:pip install ulang,用法与例程请见 PyPI。源码位于开源中国(文末链接)。 需 python 3.7,源码文件需 UTF-8 编码】
本周发布木兰编程语言版本 0.0.14.8。将 Python 框架 tornado自带的用 WebSocket 实现聊天的例程改为木兰实现。顺便将该例程涉及的木兰与 Python 语法对比小结,包括本周重现的 super 语法等。
主要木兰代码如下(完整代码见源码库)
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("发到%d个接收端", len(聊天渠道.接收端))
for 某接收端 in 聊天渠道.接收端 {
// TODO: try catch 尚待重现
//try:
某接收端.write_message(消息)
//except:
// logging.error("Error sending message", exc_info=True)
}
}
func $on_message(内容) {
logging.info("收到消息: %r", 内容)
parsed = tornado.escape.json_decode(内容)
消息 = {"id": str(uuid.uuid4()), "body": parsed["body"]}
消息["html"] = tornado.escape.to_basestring(
$render_string("message.html", message=消息)
)
聊天渠道.更新历史(消息)
聊天渠道.广播(消息)
}
}
下面都基于当前对木兰的认识,今后随重现项目进展可能修改
define("port", default=8888, help="run on the given port", type=int)
最后一个形参的 keyword 为 type,正好是木兰的语法关键词。因此只能改为位置形参(顺便中文化封装):
func 定义(名称 : str, 默认=nil, 类型=nil, 帮助=nil) {
define(名称, 默认, 类型, 帮助)
}
定义("port", 默认=8888, 帮助="在此端口运行服务", 类型=int)
主要部分的代码行数统计,格式为:上次->现在。
页面更新:2024-04-24
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号