python 实用工具状态机transitions


Posted in Python onNovember 21, 2020

说明 

1. 状态机是一个非常实用的理论。在涉及到复杂的场景,建立状态机模型,能带来极大的方便。比如,网络连接、模型状态、业务逻辑。 
2. 状态机并不复杂, 重要的是它的思想,能够极大减轻复杂度。使用时关键在于定义好事件和动作。 

基本概念 

  • State: 状态
  • Event: 事件. 事件触发状态变换
  • Action: 动作. event发生前或后执行的动作
  • transition: 变换. 状态变换

github

https://github.com/pytransitions/transitions

安装

pip install transitions

简单示例

# 连接协议状态机
from transitions.extensions import HierarchicalMachine as Machine
from transitions.extensions.nesting import NestedState
 
class ConnectionStateMachine:
    """Connection state machine."""
 
    def __init__(self, callbacks=None):
        """
        :param callbacks: callbacks for the state machine
        """
        self.callbacks = {}
 
        # 定义状态
        self.states = ["STATE_NOT_CONNECTED",
                       {
                            'name': "STATE_CONNECTED",   # 状态名
                            'on_enter': self._on_enter_CONNECTED,  # 进入状态触发
                            'on_exit': self._on_exit_CONNECTED,    # 退出状态触发
                            'children': [     # 状态嵌套
                                "STATE_NOT_SELECTED",
                                {
                                    'name': "STATE_SELECTED",
                                    'on_enter': self._on_enter_CONNECTED_SELECTED
                                }
                            ]
                       }]
 
        # transition 1
        self.machine = Machine(model=self, states=self.states, initial="STATE_NOT_CONNECTED", auto_transitions=False)
 
        if callbacks:
            self.callbacks = callbacks
 
        # 定义状态变换
        self.machine.add_transition('connect', "STATE_NOT_CONNECTED", "STATE_CONNECTED_NOT_SELECTED")  # transition 2
        self.machine.add_transition('disconnect', "STATE_CONNECTED", "STATE_NOT_CONNECTED")  # transition 3
        self.machine.add_transition('select', "STATE_CONNECTED_NOT_SELECTED", "STATE_CONNECTED_SELECTED")  # transition 4
        self.machine.add_transition('deselect', "STATE_CONNECTED_SELECTED", "STATE_CONNECTED_NOT_SELECTED")  # transition 5
        self.machine.add_transition('timeoutT7', "STATE_CONNECTED_NOT_SELECTED", "STATE_NOT_CONNECTED")  # transition 6
 
    # 事件触发的动作
    def _on_enter_CONNECTED(self):
        if "on_enter_CONNECTED" in self.callbacks:
            self.callbacks["on_enter_CONNECTED"]()
 
    def _on_exit_CONNECTED(self):
        if "on_exit_CONNECTED" in self.callbacks:
            self.callbacks["on_exit_CONNECTED"]()
 
    def _on_enter_CONNECTED_SELECTED(self):
        if "on_enter_CONNECTED_SELECTED" in self.callbacks:
            self.callbacks["on_enter_CONNECTED_SELECTED"]()

定义状态机

# 一般都是两种:不嵌套、嵌套
from transitions import Machine   #不嵌套
from transitions.extensions import HierarchicalMachine as Machine # 嵌套
 
# 检查状态
machine.state
machine.is_<state_name>()

定义状态

# 状态可以是三种类型: 对象、字符串、字典
from transitions import State
states = [
    State(name="solid"),    # 对象
    "liquid",               # 字符串
    {"name": "gas"}         # 字典
]

定义变换

# 定义函数
machine.add_transition(trigger, source, dest, )
trigger(str)         方法名,触发状态转换
source(str or list)  源状态
dest(str)            目标状态
 
# 加上变换
machine.add_transition(trigger="wake_up", source="asleep", dest="hanging out")
machine.add_transition('work_out', 'hanging out', 'hungry')
machine.add_transition('nap', '*', 'asleep')   # 从任意状态变为asleep

以上就是python 实用工具状态机transitions的详细内容,更多关于python transitions的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Docker上部署Python的Flask框架的教程
Apr 08 Python
python动态加载包的方法小结
Apr 18 Python
Python中的__slots__示例详解
Jul 06 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
详解字符串在Python内部是如何省内存的
Feb 03 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
python numpy库np.percentile用法说明
Jun 08 Python
python爬虫基础之urllib的使用
Dec 31 Python
解析python中的jsonpath 提取器
Jan 18 Python
Python之matplotlib绘制折线图
Apr 13 Python
python 实现表情识别
Nov 21 #Python
python 实现性别识别
Nov 21 #Python
python遍历路径破解表单的示例
Nov 21 #Python
Python如何批量生成和调用变量
Nov 21 #Python
在终端启动Python时报错的解决方案
Nov 20 #Python
python 批量下载bilibili视频的gui程序
Nov 20 #Python
Python ellipsis 的用法详解
Nov 20 #Python
You might like
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
Angular CLI 使用教程指南参考小结
2019/04/10 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
Python检测数据类型的方法总结
2019/05/20 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
YUV转为jpg图像的实现
2019/12/09 Python
opencv python如何实现图像二值化
2020/02/03 Python
Python reversed函数及使用方法解析
2020/03/17 Python
python如何爬取动态网站
2020/09/09 Python
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
编辑找工作求职信分享
2014/01/03 职场文书
学校安全防火方案
2014/06/07 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2014年新教师工作总结
2014/11/08 职场文书
高三复习计划
2015/01/19 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android