Python 状态机

主流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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值