跳到主要内容

更多风格

为了支持用户不同的代码习惯,简化 python sdk 使用难度,python sdk 在原来装饰器风格的基础上,还支持下面两种组件实现方式。

简单函数

import suanpan
from suanpan.log import logger
from suanpan.simple_run import simple_run

param1 = None
param2 = None


def initialize(init_context):
"""初始化"""
logger.info(f"initialize, {init_context}")
param1 = init_context.args['param1']
param2 = init_context.args['param2']


def run(context):
"""消息处理"""
args = context.args
logger.info(f"args: {args}")

logger.info('run ...')
return f'Hello Suanpan, {args.inputData1}!'


if __name__ == "__main__":
simple_run()

这段代码定义了两个方法:

  1. initialize 用于初始化工作,context 参数传入的是算盘上给组件设置的配置参数,如果不需要初始化,initialize 可以没有;
  2. run 方法用于处理消息流接收到的每个消息,context 参数传入的是输入参数,run 方法是必须的;
  3. 当 run 方法处理完任务之后,return 的信息会转换成输出参数,传到下一个节点。
  4. 最后,在 main 里使用 suanpan.simple_run.simple_run() 运行整个组件程序。

!!! info "提示"

上面的组件代码没有定义输入输出,它直接从算盘右面板获取用户的输入桩、输出桩和参数定义。

!!! warning "注意"

这种方式没有实现 `afterInit` 或 `beforeCall` 等其他接口,功能较简单。

组件类

有些开发者更希望使用类这样的面向对象的方式开发,算盘 SDK 可以这么做:

import suanpan
from suanpan.app import app, MessageHandler
from suanpan.log import logger
from suanpan.node import node
from suanpan.app.arguments import String, Json


@app.use
class HelloClass(MessageHandler):
def __init__(self):
super().__init__()
self.add_input(Json(key="inputData1", alias="user_text", default="Suanpan"))
self.add_param(String(key="prefix", alias="prefix"))
self.add_output(Json(key="outputData1", alias="result"))

def initialize(self):
logger.info(f"initialize, {self.context}")

def beforeCall(self, context):
args = context.args
logger.info(f"beforeCall, {args}")

def run(self, context):
args = context.args
logger.info(f"args: {args}")
logger.info(f"node.inargs: {node.inargs}")

logger.info('run ...')
return f'Hello World, {args.prefix} {args.user_text}!'
  1. 用户自定义类必须继承 MessageHandler 类,这个基类实现了一些参数解析的功能,也帮助用户了解基本的方法;
  2. 用户自定义类前面必须使用 @app.use 装饰,这保证了组件启动命令和原来方式一致,python run.py components.hello_calss.app
  3. 类的初始化方法 __init__ 中,需要预先申明 input、output 和 param参数;
  4. initialize 在类实例化之后调用,此时 param 申明的变量可以通过 self.context 获取,和 param 相关的初始化工作可以在这个方法中实现;
  5. run方法是消息处理的主方法,每一个到达组件的消息都会调用这个方法;
  6. 其他 beforeInitafterInitbeforeCallafterCall方法与装饰器调用方法相兼容。