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 相关文章推荐
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
使用Django和Python创建Json response的方法
Mar 26 Python
用Python3创建httpServer的简单方法
Jun 04 Python
浅谈Pandas 排序之后索引的问题
Jun 07 Python
python实现人民币大写转换
Jun 20 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
pytorch SENet实现案例
Jun 24 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
PHP中Session的概念
2006/10/09 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
PHP实现上传图片到数据库并显示输出的方法
2018/05/31 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
字段太多jquey快速清空表单内容方法
2014/08/21 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
深入理解Python装饰器
2016/07/27 Python
Python获取CPU、内存使用率以及网络使用状态代码
2018/02/08 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
tensorflow 实现数据类型转换
2020/02/17 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
全球性的女装店:storets
2019/06/12 全球购物
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
精彩的演讲稿开头
2014/05/08 职场文书
2014年度工作总结报告
2014/12/15 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
小学三年级语文教学反思
2016/03/03 职场文书