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网页请求urllib2模块简单封装代码
Feb 07 Python
Python 正则表达式(转义问题)
Dec 15 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
Mar 02 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
python获取array中指定元素的示例
Nov 26 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
PyTorch 中的傅里叶卷积实现示例
Dec 11 Python
详解python3类型注释annotations实用案例
Jan 20 Python
Django REST framework 限流功能的使用
Jun 24 Python
详解Python中__new__方法的作用
Mar 31 Python
使用Python开发冰球小游戏
Apr 30 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP之header函数详解
2021/03/02 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
2019/06/27 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
人事主管的岗位职责
2013/11/16 职场文书
策划总监岗位职责
2014/02/16 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
买房协议书范本
2014/10/23 职场文书
2015年图书馆个人工作总结
2015/05/26 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
Python进度条的使用
2021/05/17 Python