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中的with...as用法介绍
May 28 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
python 删除非空文件夹的实例
Apr 26 Python
python 给DataFrame增加index行名和columns列名的实现方法
Jun 08 Python
Python登录注册验证功能实现
Jun 18 Python
python编辑用户登入界面的实现代码
Jul 16 Python
记录Python脚本的运行日志的方法
Jun 05 Python
python中的句柄操作的方法示例
Jun 20 Python
python读取Excel表格文件的方法
Sep 02 Python
python3正则模块re的使用方法详解
Feb 11 Python
Pycharm如何运行.py文件的方法步骤
Mar 03 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
javascript 写类方式之二
2009/07/05 Javascript
js 操作符实例代码
2009/10/24 Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
js的各种排序算法实现(总结)
2016/07/23 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
prototype.js简单实现ajax功能示例
2017/10/18 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
详解K-means算法在Python中的实现
2017/12/05 Python
python机器学习之KNN分类算法
2018/08/29 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
2018/11/07 Python
python3 pygame实现接小球游戏
2019/05/14 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
公司经理任命书
2014/06/05 职场文书
财务管理专业求职信
2014/06/11 职场文书
先进个人事迹材料
2014/12/29 职场文书
受资助学生感谢信
2015/01/21 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
刘胡兰观后感
2015/06/16 职场文书