python 實(shí)用工具狀態(tài)機(jī)transitions
說(shuō)明
1. 狀態(tài)機(jī)是一個(gè)非常實(shí)用的理論。在涉及到復(fù)雜的場(chǎng)景,建立狀態(tài)機(jī)模型,能帶來(lái)極大的方便。比如,網(wǎng)絡(luò)連接、模型狀態(tài)、業(yè)務(wù)邏輯。
2. 狀態(tài)機(jī)并不復(fù)雜, 重要的是它的思想,能夠極大減輕復(fù)雜度。使用時(shí)關(guān)鍵在于定義好事件和動(dòng)作。
基本概念
- State: 狀態(tài)
- Event: 事件. 事件觸發(fā)狀態(tài)變換
- Action: 動(dòng)作. event發(fā)生前或后執(zhí)行的動(dòng)作
- transition: 變換. 狀態(tài)變換
github
https://github.com/pytransitions/transitions
安裝
pip install transitions
簡(jiǎn)單示例
# 連接協(xié)議狀態(tài)機(jī) 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ā)的動(dòng)作 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)機(jī)
# 一般都是兩種:不嵌套、嵌套 from transitions import Machine #不嵌套 from transitions.extensions import HierarchicalMachine as Machine # 嵌套 # 檢查狀態(tài) machine.state machine.is_<state_name>()
定義狀態(tài)
# 狀態(tài)可以是三種類型: 對(duì)象、字符串、字典 from transitions import State states = [ State(name="solid"), # 對(duì)象 "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 實(shí)用工具狀態(tài)機(jī)transitions的詳細(xì)內(nèi)容,更多關(guān)于python transitions的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 簡(jiǎn)單理解Python中基于生成器的狀態(tài)機(jī)
- 狀態(tài)機(jī)的概念和在Python下使用狀態(tài)機(jī)的教程
- 淺談python中常用的excel模塊庫(kù)
- Python 中拼音庫(kù) PyPinyin 用法詳解
- 教你使用Python pypinyin庫(kù)實(shí)現(xiàn)漢字轉(zhuǎn)拼音
- python munch庫(kù)的使用解析
- Python爬蟲(chóng)基礎(chǔ)之selenium庫(kù)的用法總結(jié)
- python爬蟲(chóng)之selenium庫(kù)的安裝及使用教程
- python狀態(tài)機(jī)transitions庫(kù)詳解
相關(guān)文章
通過(guò)python連接Linux命令行代碼實(shí)例
這篇文章主要介紹了通過(guò)python連接Linux命令行代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)測(cè)試工具(一)——命令行發(fā)送get請(qǐng)求
這篇文章主要介紹了python如何實(shí)現(xiàn)命令行發(fā)送get請(qǐng)求,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下2020-10-10解決Python print 輸出文本顯示 gbk 編碼錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決Python print 輸出文本顯示 gbk 編碼錯(cuò)誤問(wèn)題,本文給出了三種解決方法,需要的朋友可以參考下2018-07-07python編寫(xiě)實(shí)現(xiàn)抽獎(jiǎng)器
這篇文章主要為大家詳細(xì)介紹了python編寫(xiě)實(shí)現(xiàn)抽獎(jiǎng)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09利用python對(duì)mysql表做全局模糊搜索并分頁(yè)實(shí)例
這篇文章主要介紹了利用python對(duì)mysql表做全局模糊搜索并分頁(yè)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07詳解pandas.DataFrame.plot() 畫(huà)圖函數(shù)
這篇文章主要介紹了詳解pandas.DataFrame.plot()畫(huà)圖函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06python實(shí)現(xiàn)銀行實(shí)戰(zhàn)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)銀行實(shí)戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Python中xml和dict格式轉(zhuǎn)換的示例代碼
最近在做APP的接口,遇到XML格式的請(qǐng)求數(shù)據(jù),費(fèi)了很大勁來(lái)解決,下面小編給大家分享下Python中xml和dict格式轉(zhuǎn)換問(wèn)題,感興趣的朋友跟隨小編一起看看吧2019-11-11