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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
python实现实时监控文件的方法
Aug 26 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
python在不同条件下的输入与输出
Feb 13 Python
Python socket处理client连接过程解析
Mar 18 Python
Python 列表反转显示的四种方法
Nov 16 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 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中$_SERVER的详细参数与说明
2008/07/29 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php汉字转拼音的示例
2014/02/27 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
angular6开发steps步骤条组件
2019/07/04 Javascript
jquery.pager.js实现分页效果
2019/07/29 jQuery
Vue Router中应用中间件的方法
2020/08/06 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
2014/05/05 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
中班幼儿评语大全
2014/04/30 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL