python 实用工具状态机transitions

时间:2021-05-22

说明

1. 状态机是一个非常实用的理论。在涉及到复杂的场景,建立状态机模型,能带来极大的方便。比如,网络连接、模型状态、业务逻辑。
2. 状态机并不复杂, 重要的是它的思想,能够极大减轻复杂度。使用时关键在于定义好事件和动作。

基本概念

  • State: 状态
  • Event: 事件. 事件触发状态变换
  • Action: 动作. event发生前或后执行的动作
  • transition: 变换. 状态变换

github

https://github.com/pytransitions/transitions

安装

pip install transitions

简单示例

# 连接协议状态机from transitions.extensions import HierarchicalMachine as Machinefrom transitions.extensions.nesting import NestedStateclass 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 1self.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 2self.machine.add_transition('disconnect', "STATE_CONNECTED", "STATE_NOT_CONNECTED") # transition 3self.machine.add_transition('select', "STATE_CONNECTED_NOT_SELECTED", "STATE_CONNECTED_SELECTED") # transition 4self.machine.add_transition('deselect', "STATE_CONNECTED_SELECTED", "STATE_CONNECTED_NOT_SELECTED") # transition 5self.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.statemachine.is_<state_name>()

定义状态

# 状态可以是三种类型: 对象、字符串、字典from transitions import Statestates = [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的资料请关注其它相关文章!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章