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 相关文章推荐
python3.3使用tkinter开发猜数字游戏示例
Mar 14 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
Python标准库笔记struct模块的使用
Feb 22 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
python字符串格式化方式解析
Oct 19 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
如何解决tensorflow恢复模型的特定值时出错
Feb 06 Python
python读取图像矩阵文件并转换为向量实例
Jun 18 Python
python 实现表情识别
Nov 21 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
python实现定时发送邮件
Dec 23 Python
Python 中的函数装饰器和闭包详解
Feb 06 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
php中批量修改文件后缀名的函数代码
2011/10/23 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
jquery live()调用不存在的解决方法
2014/02/26 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
Python3读取zip文件信息的方法
2015/05/22 Python
django2 快速安装指南分享
2018/01/05 Python
python使用folium库绘制地图点击框
2018/09/21 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
python操作链表的示例代码
2020/09/27 Python
比利时买床:Beter Bed
2017/12/06 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
银行学习十八大感想
2014/01/11 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
基于tensorflow权重文件的解读
2021/05/26 Python
Vue图片裁剪组件实例代码
2021/07/02 Vue.js