python 实用工具状态机transitions

 更新时间:2020年11月21日 17:21:17   作者:妙音  
这篇文章主要介绍了python 实用工具状态机transitions的使用,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

说明 

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 中 logging 模块使用详情

     Python 中 logging 模块使用详情

    这篇文章主要介绍了 Python 中 logging 模块使用,在我们写程序时,可以借助 logging 模块的输出信息来调试代码,下文章关于 logging 模块的使用相关内容,需要的小伙伴可以参考一下
    2022-03-03
  • pandas中Series运算汇总(算术、比较和逻辑运算)

    pandas中Series运算汇总(算术、比较和逻辑运算)

    本文主要介绍了pandas中Series运算汇总,包括算术运算、比较运算和逻辑运算等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 使用python Fabric动态修改远程机器hosts的方法

    使用python Fabric动态修改远程机器hosts的方法

    今天小编就为大家分享一篇使用python Fabric动态修改远程机器hosts的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • 如何基于Python制作有道翻译小工具

    如何基于Python制作有道翻译小工具

    这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 详解pandas中Series()和DataFrame()的区别与联系

    详解pandas中Series()和DataFrame()的区别与联系

    本文主要介绍了详解pandas中Series()和DataFrame()的区别与联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Python学习之Django的管理界面代码示例

    Python学习之Django的管理界面代码示例

    这篇文章主要介绍了Python学习之Django的管理界面代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Django的分页器实例(paginator)

    Django的分页器实例(paginator)

    下面小编就为大家分享一篇Django的分页器实例(paginator),具有很好的参考价值,希望对大家有所帮助
    2017-12-12
  • PyTorch的Debug指南

    PyTorch的Debug指南

    这篇文章主要介绍了PyTorch的Debug的相关资料,帮助大家更好的理解和学习使用PyTorch,感兴趣的朋友可以了解下
    2021-05-05
  • Python实现将SQLite中的数据直接输出为CVS的方法示例

    Python实现将SQLite中的数据直接输出为CVS的方法示例

    这篇文章主要介绍了Python实现将SQLite中的数据直接输出为CVS的方法,涉及Python连接、读取SQLite数据库及转换CVS格式数据的相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • Jupyter Notebook界面汉化完整步骤

    Jupyter Notebook界面汉化完整步骤

    这篇文章主要给大家介绍了关于Jupyter Notebook界面汉化的相关资料,设置成中文界面后非常利于操作,文中介绍的方法非常简单,需要的朋友可以参考下
    2023-09-09

最新评论