主流Python状态机库
transitions
特点:
- 轻量级状态机库
- 支持简单状态机和层次化状态机(HSM)
- 提供状态转换回调函数
- 支持条件性转换(Guards)
- 与FastAPI等框架集成良好
安装:
pip install transitions
下面给出一个简单示例
from typing import Optional
from transitions import State, Machine
from enum import Enum, auto
class MatterState(Enum):
"""物质状态枚举类"""
SOLID = auto() # 固态
LIQUID = auto() # 液态
GAS = auto() # 气态
PLASMA = auto() # 等离子态
def __str__(self) -> str:
"""返回小写字符串表示,用于状态机名称匹配"""
return self.name.lower()
class Matter:
state: Optional[MatterState] = None # 状态属性,使用枚举类型
def say_hello(self):
print(f"hello, {self.state or 'unknown'} state")
def say_goodbye(self):
print(f"goodbye, {self.state or 'unknown'} state")
def on_exit_solid(self):
print(f"Exiting {self.state} state!")
def on_enter_liquid(self):
print(f"Entering {self.state} state!")
def next(self):
return self.trigger('next')
def __init__(self):
# 基于枚举创建状态列表
self.states = [
State(
name=str(state), # 转换为小写字符串作为状态名称
on_enter='say_hello',
on_exit='say_goodbye'
) for state in MatterState
]
# 初始化状态机
self.machine = Machine(
model=self,
states=self.states,
initial=str(MatterState.SOLID), # 初始状态为固态
auto_transitions=False
)
# 定义转换规则(使用枚举的字符串表示)
self.machine.add_transition(
trigger='next',
source=str(MatterState.SOLID),
dest=str(MatterState.LIQUID)
)
self.machine.add_transition(
trigger='next',
source=str(MatterState.LIQUID),
dest=str(MatterState.GAS)
)
self.machine.add_transition(
trigger='next',
source=str(MatterState.GAS),
dest=str(MatterState.PLASMA)
)
self.machine.add_transition(
trigger='sublimate',
source=str(MatterState.SOLID),
dest=str(MatterState.GAS)
) # 升华触发
if __name__ == "__main__":
lump = Matter()
print("初始状态:", lump.state) # 输出:初始状态: MatterState.SOLID
# 第一次调用 next():solid → liquid
print("\n触发 next() 从 solid 转换:")
lump.next()
print("当前状态:", lump.state) # 输出:当前状态: MatterState.LIQUID
# 第二次调用 next():liquid → gas
print("\n触发 next() 从 liquid 转换:")
lump.next()
print("当前状态:", lump.state) # 输出:当前状态: MatterState.GAS
# 状态检查
print("\n状态检查:")
print("是否为 solid?", lump.is_solid()) # False
print("是否为 liquid?", lump.is_liquid()) # False
print("是否为 gas?", lump.is_gas()) # True
# 测试升华
print("\n触发升华(solid → gas):")
lump2 = Matter()
lump2.sublimate()
print("升华后的状态:", lump2.state) # 输出:升华后的状态: MatterState.GAS

被折叠的 条评论
为什么被折叠?



