木兰编程语言 0.0.14.8:WebSocket 聊天演示;部分比较 Python 语法

栏目: 软件资讯 · 发布时间: 5年前

内容简介:【安装:pip install ulang,用法与例程请见 PyPI。源码位于开源中国。 注意:必需 python 3.7,源码文件需 UTF-8 编码】 本周将 Python 框架 tornado自带的用 websocket 实现聊天的例程改为木兰实现。顺便将该例...

【安装:pip install ulang,用法与例程请见 PyPI。源码位于开源中国注意:必需 python 3.7,源码文件需 UTF-8 编码

本周将 Python 框架 tornado自带的用 websocket 实现聊天的例程改为木兰实现。顺便将该例程涉及的木兰与 Python 语法对比小结,包括本周重现的 super 语法等。

1 实例演示

木兰编程语言 0.0.14.8:WebSocket 聊天演示;部分比较 Python 语法

主要木兰代码如下(完整代码在此

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=消息)
    )

    聊天渠道.更新历史(消息)
    聊天渠道.广播(消息)
  }
}

2 与例程涉及的 Python 语法对比

下面都基于当前对木兰的认识,今后随重现项目进展可能修改

必须(否则报错)

  • 如碰到形参的关键词为 type,需改为位置形参。如原始例程中的:
define("port", default=8888, help="run on the given port", type=int)

最后一个形参的 keyword 为 type,正好是木兰的语法关键词。因此只能改为位置形参(顺便中文化封装):

func 定义(名称 : str, 默认=nil, 类型=nil, 帮助=nil) {
  define(名称, 默认, 类型, 帮助)
}
定义("port", 默认=8888, 帮助="在此端口运行服务", 类型=int)
  • 木兰只有静态方法(staticmethod)。碰到 Python 的 classmethod 时,引用类变量时用类名取代 cls。见上面的 更新历史 方法。
  • 需 tuple() 初始化元组,见前文介绍
  • 所有块改为 {},取代 Python 中的冒号
  • class 变 type,用冒号指定类型,包括指定形参类型、超类等
  • 注释段用 /* */,注释行用 //
  • import 变 using
  • None 变 nil
  • def 变 func
  • 【本周】super() 变 super
  • 【本周】不支持 **,改用列举形参
  • 类变量需用{}包围
  • 字典初始化 {:}

可选

  • self 变 $,见前文介绍
  • 构造函数用类名而非__init__
  • 无参数函数定义时可省略 ()

附:代码量统计

主要部分的代码行数统计,格式为:上次->现在。

  • 木兰代码量 2965 -> 3114
    • 编辑器,实现与测试都是木兰代码:432 -> 431 (在为分为前后端实现调研网络服务框架)
    • 木兰测试用例,包括部分实用小程序(如井字棋):2533 -> 2683

 

  • Python 代码量(木兰实现与测试框架):2594 -> 2612
    • 分析器/语法分析器.py:1008 -> 1019
    • 分析器/词法分析器.py:204 -> 207
    • 测试/运行所有.py,检验所有木兰测试代码片段:192 -> 194
    • 环境.py,定义全局方法:171 -> 172
    • 分析器/语法成分.py,从语法分析器中提取出来的枚举常量:81 -> 82
    • 功用/反馈信息.py:65 -> 67
    • 测试/unittest/语法树.py,确保生成的语法树与原始版本一致:67 -> 66
    • 未变
      • 分析器/语法树.py:202
      • 交互.py,交互环境(REPL):138
      • 中.py,主程序:74
      • 功用/调试辅助.py,:57
      • setup.py, 34
      • 分析器/错误.py:17
      • 测试/unittest/交互.py,交互环境相关测试:28

以上所述就是小编给大家介绍的《木兰编程语言 0.0.14.8:WebSocket 聊天演示;部分比较 Python 语法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Pragmatic Programmer

The Pragmatic Programmer

Andrew Hunt、David Thomas / Addison-Wesley Professional / 1999-10-30 / USD 49.99

本书直击编程陈地,穿过了软件开发中日益增长的规范和技术藩篱,对核心过程进行了审视――即根据需求,创建用户乐于接受的、可工作和易维护的代码。本书包含的内容从个人责任到职业发展,直至保持代码灵活和易于改编重用的架构技术。从本书中将学到防止软件变质、消除复制知识的陷阱、编写灵活、动态和易适应的代码、避免出现相同的设计、用契约、断言和异常对代码进行防护等内容。一起来看看 《The Pragmatic Programmer》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具