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)文章!
相關(guān)文章
Python3爬蟲使用Fidder實(shí)現(xiàn)APP爬取示例
這篇文章主要介紹了Python3爬蟲使用Fidder實(shí)現(xiàn)APP爬取示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
使用Python將TS文件轉(zhuǎn)換為MP4的操作方法
在多媒體處理中,將不同格式的視頻文件進(jìn)行轉(zhuǎn)換是一項(xiàng)常見(jiàn)的任務(wù),TS(Transport Stream)是一種常用的流媒體格式,而MP4則是更為廣泛使用的通用視頻格式,本文將介紹如何使用Python和FFmpeg工具將TS文件轉(zhuǎn)換為MP4文件,需要的朋友可以參考下2025-04-04
Django定時(shí)任務(wù)Django-crontab的使用詳解
測(cè)試平臺(tái)執(zhí)行測(cè)試用例時(shí),可以借助jenkins之類的CI/CD工具,也可以使用定時(shí)任務(wù)crontab,作為測(cè)試開(kāi)發(fā)工程師,我們可能沒(méi)有權(quán)限去操作服務(wù)器,那么我們就只能使用django-crontab,在指定時(shí)間循環(huán)執(zhí)行測(cè)試用例,對(duì)定時(shí)任務(wù)Django-crontab的使用感興趣的朋友一起看看吧2022-07-07
Python進(jìn)行ECB加密的實(shí)現(xiàn)流程
在信息安全領(lǐng)域,對(duì)稱加密算法AES因高效性和安全性被廣泛應(yīng)用,ECB作為AES最基礎(chǔ)的加密模式,因其簡(jiǎn)單實(shí)現(xiàn)成為學(xué)習(xí)加密技術(shù)的入門案例,本文將系統(tǒng)解析ECB模式原理,并通過(guò)Python代碼演示完整加解密流程,需要的朋友可以參考下2025-09-09
Python腳本利用adb進(jìn)行手機(jī)控制的方法
這篇文章主要介紹了Python腳本利用adb進(jìn)行手機(jī)控制的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python中str is not callable問(wèn)題詳解及解決辦法
這篇文章主要介紹了Python中str is not callable問(wèn)題詳解及解決辦法的相關(guān)資料,需要的朋友可以參考下2017-02-02

