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中executemany和序列的使用方法
Aug 12 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
python如何统计代码运行的时长
Jul 24 Python
Python 过滤错误log并导出的实例
Dec 26 Python
Python实现汇率转换操作
May 03 Python
什么是python的函数体
Jun 19 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
python3中celery异步框架简单使用+守护进程方式启动
Jan 20 Python
教你如何用python开发一款数字推盘小游戏
Apr 14 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
js查找父节点的简单方法
2008/06/28 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
python difflib模块示例讲解
2017/09/13 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
python实现ID3决策树算法
2018/08/29 Python
pandas 时间格式转换的实现
2019/07/06 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
什么是封装
2013/03/26 面试题
2014全国两会学习心得体会1000字
2014/03/10 职场文书
法律进机关实施方案
2014/03/12 职场文书