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 相关文章推荐
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
python使用锁访问共享变量实例解析
Feb 08 Python
Python语言的变量认识及操作方法
Feb 11 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
python定时关机小脚本
Jun 20 Python
Python3.8中使用f-strings调试
May 22 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
Mar 11 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 26 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
jQuery EasyUI API 中文文档 DateTimeBox日期时间框
2011/10/16 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
2015/04/16 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
简单的分页代码js实现
2016/05/17 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
详解使用vue实现tab 切换操作
2017/07/03 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
Python greenlet实现原理和使用示例
2014/09/24 Python
python编写Logistic逻辑回归
2020/12/30 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
python中partial()基础用法说明
2018/12/30 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
python golang中grpc 使用示例代码详解
2020/06/03 Python
软件测试工程师面试问题精选
2016/10/28 面试题
员工安全承诺书
2014/05/22 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
个人合作协议范本
2015/08/06 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
分享几个JavaScript运算符的使用技巧
2021/04/24 Javascript
MySQL七种JOIN类型小结
2021/10/24 MySQL
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript