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 相关文章推荐
python内存管理分析
Apr 08 Python
Python文件去除注释的方法
May 25 Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
Python Gitlab Api 使用方法
Aug 28 Python
python中class的定义及使用教程
Sep 18 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
python文件名批量重命名脚本实例代码
Apr 22 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python学习之包与模块详解
Mar 19 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
php格式输出文件var_export函数实例
2014/11/15 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
php简单的上传类分享
2016/05/15 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
web前端开发upload上传头像js示例代码
2016/10/22 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
详解JavaScript数据类型和判断方法
2020/09/04 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python import自定义模块方法
2015/02/12 Python
python将unicode转为str的方法
2017/06/21 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
喷漆工的岗位职责
2014/03/17 职场文书
2015年资料员工作总结
2015/04/25 职场文书
圣诞晚会主持词
2015/07/01 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
纯html+css实现打字效果
2021/08/02 HTML / CSS
asyncio异步编程之Task对象详解
2022/03/13 Python