-
Notifications
You must be signed in to change notification settings - Fork 54
变量机制
变量一共分为 三种,分别是 Plain, Lazy 和 Splice 类型的变量。
todo
SPLICE 类型的变量能够帮助我们声明变量与变量间的引用关系,灵活使用 SPLICE 类型的变量能够在流程中实现很多复杂的数据交互操作。我们通过 ${xxxx}
的形式来声明对数据上下文中某个变量的引用;另外,数据上下文中只有 key 为 ${xxxx}
形式的变量能够被 SPLICE 变量引用。
所有的 SPLICE 类型的变量在创建时仅仅声明了他们的引用关系,并没有进行解析操作。在流程中的节点执行前,引擎会解析该节点数据对象输入中所有的 SPLICE 变量,在解析的过程中,直接或间接被这些 SPLICE 变量引用的其他 SPLICE 变量也会被解析。以下面的场景为例
当 act_1 执行前,引擎会解析其数据对象输入中的 param_1
变量,因为 param_1
直接引用了数据上下文中的 ${constant_1}
变量,所以 ${constant_1}
的值也会被解析,一直解析到 ${constant_2}
。而数据上下文中的 ${constant_3}
,${constant_4}
因为没有被 act_1 中的变量引用,所以就没有进行解析。
以下面一个场景为例,我们的 act_1 的 param_1
输入需要引用数据上下文中定义的 ${constant_1}
变量
那么我们可以按照以下的方式来声明这两个变量之间的关系,当 act_1 执行前,param_1
解析后其值应为 value_1
。
# in act_1 component inputs
{
'param_1': {
'type': 'splice',
'value': '${constant_1}'
}
}
# in data context inputs
{
'${constant_1}': {
'type': 'plain',
'value': 'value_1'
}
}
当然,变量之间也能够存在链式的引用关系
声明方式如下,param_1
解析后其值应为 value_1_value_2_value_3
:
# in act_1 component inputs
{
'param_1': {
'type': 'splice',
'value': '${constant_1}'
}
}
# in data context inputs
{
'${constant_1}': {
'type': 'plain',
'value': 'value_1_${constant_2}'
},
'${constant_2}': {
'type': 'plain',
'value': 'value_2_${constant_3}'
},
'${constant_3}': {
'type': 'plain',
'value': 'value_3'
},
}
一个变量引用多个变量当然也是支持的
声明方式如下,param_1
解析后其值应为 value_1__value_2
:
# in act_1 component inputs
{
'param_1': {
'type': 'splice',
'value': '${constant_1}__${constant_2}'
}
}
# in data context inputs
{
'${constant_1}': {
'type': 'plain',
'value': 'value_1'
},
'${constant_2}': {
'type': 'plain',
'value': 'value_2'
}
}
除了通过 ${xxx}
语法引用数据上下文中的变量,引擎还支持对变量执行一些 python 操作
-
字符串拼接:
${"prefix" + KEY}
、${"prefix%s" % KEY}
、${"prefix{}".format(KEY)}
、${"%s%s" % (KEY1, KEY2)}
-
字符串变换:
${KEY.upper()}
、${KEY.replace("\n", ",")}
、${KEY[0:2]}
、${KEY.strip()}
-
数字运算:
${int(KEY) + 1}
、${int(KEY)/10}
-
类型转换:
${KEY.split("\n")}
、${KEY.count()}
、${list(KEY)}
、${[item.strip() for item in KEY.split("\n")]}
基本上 python 中能够在一行语句中实现的操作,都能够在 SPLICE 变量中实现
LAZY 类型的变量除了能够帮助我们声明变量与变量间的引用关系,还能让我们在 SPICE 变量的基础上,自定义对引用解析结果的进一步操作和处理逻辑。
LAZY 类型的变量引用能力,继承自 SPICE 变量的实现,具体说明可参考 SPICE 变量使用说明。
LAZY 类型变量对应 pipeline.core.data.var.LazyVariable
类,是一个继承了 pipeline.core.data.var.SpliceVariable
类的抽象类,
抽象方法是 get_value
,在 get_value
方法中,我们可以对引用解析结果进行进一步处理。
下面以【支持格式自定义的系统当前时间】为例,介绍如何通过 LAZY 变量实现支持变量引用和自定义处理的系统当前时间变量。
import datetime
from pipeline.core.data.var import LazyVariable
class FormatSupportCurrentTime(LazyVariable):
code = "format_support_current_time"
name = "支持格式自定义的系统当前时间"
def get_value(self):
time_format = self.value.get("time_format", "%Y-%m-%d %H:%M:%S").strip()
now = datetime.datetime.now()
current_time = now.strftime(time_format)
return current_time
在 get_value
方法中,我们通过 self.value
获取到引用解析之后的时间格式数据,然后获取当前时间,并将其转换为对应的时间格式后输出,过程如下图所示: