Created by: Aurelius84
PR功能
-
动转静支持
lambda
语法
PR内容
- 添加了
lambda
的语法单测,覆盖测试语法功能 - 增强了
IfExpr
复杂表达式转为layers.cond
时,多个assign语句会合并一条statement.
# 原始代码
out = add_func(y) if y and y < 2 else (lambda x: x**2)(y)
# 转化后代码:
out = fluid.layers.cond(fluid.layers.logical_or(
x=fluid.layers.cast(x=y, dtype='bool'),
y=y < 2),
lambda : convert_call(add_func)(y),
lambda :convert_call(lambda x: x ** 2)(y))
合并的原因:IfExpr
可能出现在任意node节点里,当判断语句比较复杂时(如包含多个and/or),产生多个条件assign语句无法确认前插的位置。故采取直接新转写的node替换原始IfExpr
语句。
# IfExpr:
y = x+1 if mean or x > 0 else x-1
# assign nodes:
bool_tensor_1 = fluid.layers.cast(x=mean, dtype='bool')
logic_or_0 = fluid.layers.logical_or(x=bool_tensor_1, y=x > 0)
# merged node:
fluid.layers.logical_or(x=fluid.layers.cast(x=mean, dtype='bool'), y=x > 0)