Skip to content

变量机制

韩数 edited this page Nov 6, 2023 · 1 revision

变量机制

变量一共分为 三种,分别是 Plain, Lazy 和 Splice 类型的变量。

PLAIN 变量

todo

SPLICE 变量

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'
    }
}

python 操作

除了通过 ${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 变量

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 获取到引用解析之后的时间格式数据,然后获取当前时间,并将其转换为对应的时间格式后输出,过程如下图所示: