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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
使用python生成目录树
Mar 29 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
对django 模型 unique together的示例讲解
Aug 06 Python
python 表格打印代码实例解析
Oct 12 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
python+openCV对视频进行截取的实现
Nov 27 Python
Python类型转换的魔术方法详解
Dec 23 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的宝库目录--PEAR
2006/10/09 PHP
ASP知识讲座四
2006/10/09 PHP
window+nginx+php环境配置 附配置搭配说明
2010/12/29 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
html中table数据排序的js代码
2011/08/09 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
jQuery xml字符串的解析、读取及查找方法
2016/03/01 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
angular4中引入echarts的方法示例
2019/01/29 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
vue v-model的用法解析
2020/10/19 Javascript
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
Tarte Cosmetics官网:美国最受欢迎的化妆品公司之一
2017/08/24 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
法国春天百货官网:Printemps.com
2020/06/29 全球购物
团日活动总结书格式
2014/05/08 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
病人慰问信范文
2015/02/15 职场文书
读书笔记格式
2015/07/02 职场文书
高中同学会致辞
2015/08/01 职场文书
导游词之潮音寺
2019/09/26 职场文书
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫