更多风格
为了支持用户不同的代码习惯,简化 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()
这段代码定义了两个方法:
- initialize 用于初始化工作,context 参数传入的是算盘上给组件设置的配置参数,如果不需要初始化,initialize 可以没有;
- run 方法用于处理消息流接收到的每个消息,context 参数传入的是输入参数,run 方法是必须的;
- 当 run 方法处理完任务之后,return 的信息会转换成输出参数,传到下一个节点。
- 最后,在 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}!'
- 用户自定义类必须继承 MessageHandler 类,这个基类实现了一些参数解析的功能,也帮助用户了解基本的方法;
- 用户自定义类前面必须使用 @app.use 装饰,这保证了组件启动命令和原来方式一致,
python run.py components.hello_calss.app
; - 类的初始化方法
__init__
中,需要预先申明 input、output 和 param参数; initialize
在类实例化之后调用,此时 param 申明的变量可以通过self.context
获取,和 param 相关的初始化工作可以在这个方法中实现;run
方法是消息处理的主方法,每一个到达组件的消息都会调用这个方法;- 其他
beforeInit
,afterInit
,beforeCall
,afterCall
方法与装饰器调用方法相兼容。