python 實用工具狀態(tài)機transitions
說明
1. 狀態(tài)機是一個非常實用的理論。在涉及到復(fù)雜的場景,建立狀態(tài)機模型,能帶來極大的方便。比如,網(wǎng)絡(luò)連接、模型狀態(tài)、業(yè)務(wù)邏輯。
2. 狀態(tài)機并不復(fù)雜, 重要的是它的思想,能夠極大減輕復(fù)雜度。使用時關(guān)鍵在于定義好事件和動作。
基本概念
- State: 狀態(tài)
- Event: 事件. 事件觸發(fā)狀態(tài)變換
- Action: 動作. event發(fā)生前或后執(zhí)行的動作
- transition: 變換. 狀態(tài)變換
github
https://github.com/pytransitions/transitions
安裝
pip install transitions
簡單示例
# 連接協(xié)議狀態(tài)機
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 = {}
# 定義狀態(tài)
self.states = ["STATE_NOT_CONNECTED",
{
'name': "STATE_CONNECTED", # 狀態(tài)名
'on_enter': self._on_enter_CONNECTED, # 進(jìn)入狀態(tài)觸發(fā)
'on_exit': self._on_exit_CONNECTED, # 退出狀態(tài)觸發(fā)
'children': [ # 狀態(tài)嵌套
"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
# 定義狀態(tài)變換
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
# 事件觸發(fā)的動作
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"]()
定義狀態(tài)機
# 一般都是兩種:不嵌套、嵌套 from transitions import Machine #不嵌套 from transitions.extensions import HierarchicalMachine as Machine # 嵌套 # 檢查狀態(tài) machine.state machine.is_<state_name>()
定義狀態(tài)
# 狀態(tài)可以是三種類型: 對象、字符串、字典
from transitions import State
states = [
State(name="solid"), # 對象
"liquid", # 字符串
{"name": "gas"} # 字典
]
定義變換
# 定義函數(shù)
machine.add_transition(trigger, source, dest, )
trigger(str) 方法名,觸發(fā)狀態(tài)轉(zhuǎn)換
source(str or list) 源狀態(tài)
dest(str) 目標(biāo)狀態(tài)
# 加上變換
machine.add_transition(trigger="wake_up", source="asleep", dest="hanging out")
machine.add_transition('work_out', 'hanging out', 'hungry')
machine.add_transition('nap', '*', 'asleep') # 從任意狀態(tài)變?yōu)閍sleep
以上就是python 實用工具狀態(tài)機transitions的詳細(xì)內(nèi)容,更多關(guān)于python transitions的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pandas中Series運算匯總(算術(shù)、比較和邏輯運算)
本文主要介紹了pandas中Series運算匯總,包括算術(shù)運算、比較運算和邏輯運算等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
使用python Fabric動態(tài)修改遠(yuǎn)程機器hosts的方法
今天小編就為大家分享一篇使用python Fabric動態(tài)修改遠(yuǎn)程機器hosts的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系
本文主要介紹了詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Python學(xué)習(xí)之Django的管理界面代碼示例
這篇文章主要介紹了Python學(xué)習(xí)之Django的管理界面代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02
Python實現(xiàn)將SQLite中的數(shù)據(jù)直接輸出為CVS的方法示例
這篇文章主要介紹了Python實現(xiàn)將SQLite中的數(shù)據(jù)直接輸出為CVS的方法,涉及Python連接、讀取SQLite數(shù)據(jù)庫及轉(zhuǎn)換CVS格式數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下2017-07-07

