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

### 必须（否则报错，或结果有异）

- python 中判断字典是否包含某键，推荐使用“键 in 字典”，集合、列表也类似。木兰中的 in 关键词并不支持这种操作，可以调用 `__contains__()`。字典、列表也可用 get。

- 木兰关键词与 Python 的标识符冲突
  - 木兰中的 type 是类型定义的关键词。Python 有些类型中有 type 属性，可用 `__getattribute__('type')` 引用。详见[此文](https://zhuanlan.zhihu.com/p/262835743)
  - 如碰到 Python 方法的形参名称为 type，调用时需改为位置形参，详见[此文](https://zhuanlan.zhihu.com/p/277557485)
  - python的内置函数 type()，可用 `.__class__` 代替

- 木兰有静态方法（staticmethod）。碰到 Python 的 classmethod 时，引用类变量时用类名取代cls。见上面的 `更新历史` 方法。
- 多项
  - 需 tuple() 初始化，见[前文介绍](https://zhuanlan.zhihu.com/p/266428706)
  - Python 中初始化长度为1的多项用 `a=1,`，木兰中因为不用 () 定义，因此无需这一语法
- 所有块改为 {}，取代 Python 中的冒号
- class 变 type，用冒号指定类型，包括指定形参类型、超类等
- 注释段用 /* */，注释行用 //
- import 变 using
- 引用（using）模块时，在木兰模块无法找到时退而寻找 python 模块
- 引用规则
  - 如果通过相对路径 `a/b/m1.ul` 运行非当前路径的代码，该代码引用同路径 `a/b` 下模块 `m2.ul` 需要用相对包路径 `using a.b.m2`。如果通过绝对路径运行，也必须从当前路径+相对包路径能找到被引用的包路径（待确认）。
  - 同一模块如果在多处引用，
- None 变 nil, True 变 true, False 变 false
- def 变 func
- super() 变 super
- 类变量需用｛｝包围
- 字典初始化 {:}
- / 如果两个数都为整数，则结果取整。如需取小数位，需要 (n + 0.0)/m
- 指定父类用 : 
- x if a else y 变为 a ? x : y。如需分行，需加小括号:
```
b = (2 > 1
  ? 3
  : 4)
```
- 运算符优先级有不同，需更全面评估。如位左移 << ，木兰中的优先级低于 < 而 python 相反。1<2<<3 在木兰中为 8 而 Python 为 True。
- 内置函数：
  - 有 print 和 println
  - isinstance 变 isa
- 字符串插值：用反引号 和 `\( \)` 包围
- 不支持
  - 字符串
    - 换行拼接，不支持 \，可用 +
    - 多行字符串不支持 """，可用 \n （win 下如何？）
  - **，改用列举形参
  - [List Comprehensions](https://docs.python.org/3.7/tutorial/datastructures.html#list-comprehensions)，可用匿名函数代替，如 `list(filter(l -> len(l)>1, lines))`
  - b = a = 4
  - "导入为"，比如：from PyQt5.QtWebEngineWidgets import QWebEngineView as QWebView
  - globals() 只能在交互环境运行，无法调用。因此无法使用 [web.py](https://webpy.org/):
    ```python
    app = web.application(urls, globals())
    ```


### 可选

- self 变 $，见[前文介绍](https://zhuanlan.zhihu.com/p/261048633)
- 构造函数用类名而非__init__
- 无参数函数定义时可省略 ()
- while True 可用 loop 代替
- range 可用 `..` 和 `..<` 代替，详见[此文](https://zhuanlan.zhihu.com/p/157251383)