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 不关闭控制台的实现方法
Oct 23 Python
python开发利器之ulipad的使用实践
Mar 16 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 Python
Jupyter notebook运行Spark+Scala教程
Apr 10 Python
Python类super()及私有属性原理解析
Jun 15 Python
Python中的With语句的使用及原理
Jul 29 Python
matplotlib绘制正余弦曲线图的实现
Feb 22 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
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
php为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
php验证码生成器
2017/05/24 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
JavaScript 事件系统
2010/07/22 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
pandas中的series数据类型详解
2019/07/06 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
详解Python3中的 input() 函数
2020/03/18 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
安全教育实施方案
2014/03/02 职场文书
公司业务员岗位职责
2014/03/18 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS