Wang Zhiyu's Blog - 2026年1月
type: channel
link: https://blog.imwangzhiyu.xyz/index.php/2026/01/
description: 一直游到海水变蓝
items: 为 Python 设计的状态机库 Transitions 开发文档 (中文翻译)

为 Python 设计的状态机库 Transitions 开发文档 (中文翻译)
type: item
date: 2026-01-02T02:49:00+08:00
description: Transitions 是一个轻量级的、面向对象的 Python 状态机实现，包含许多扩展功能。兼容 Python 2.7+ 和 3.0+。 安装 pip install transitions 快速入门 俗话说，一个好的例子抵得上 100 页 API 文档、一百万个指令或一千句话。 好吧，说这话的人可能有点夸张... 但不管怎样，这里有一个例子： from transitions import Machine import random class 嗜睡超级英雄(object): # 定义一些状态。大多数时候，嗜睡超级英雄就像普通人一样。 # 除了... states = ['睡觉中', '闲逛中', '饥饿中', '满身汗', '拯救世界'] def __init__(self, name): # 在我的地盘上不允许有无名的超级英雄！每个嗜睡超级英雄都必须有名字。 # 任何名字都行。瞌睡侠、梦游女。你懂的。 self.name = name # 今天我们救了啥？ self.kittens_rescued = 0 # 初始化状态机 self.machine = Machine(model=self, states=嗜睡超级英雄.states, initial='睡觉中') # 添加一些转换。我们也可以像上面定义状态那样，用一个字典的静态列表来定义它们， # 然后将这个列表作为 transitions= 参数传给 Machine 的初始化器。 # 某个时刻，每个超级英雄都必须起床亮相。 self.machine.add_transition(trigger='唤醒', source='睡觉中', dest='闲逛中') # 超级英雄需要保持身材。 self.machine.add_transition('锻炼', '闲逛中', '饥饿中') # 消耗的卡路里不会自己补充！ self.machine.add_transition('吃', '饥饿中', '闲逛中') # 超级英雄随时待命。永远待命。但他们并不总是穿着适合工作的服装。 self.machine.add_transition('求救信号', '*', '拯救世界', before='换上超级秘密战衣') # 他们下班时，浑身是汗，脏兮兮的。但在做其他事情之前， # 他们必须仔细记录他们最新的冒险经历。因为法律部门这么说。 self.machine.add_transition('完成任务', '拯救世界', '满身汗', after='更新日志') # 汗水是一种可以通过水解决的状况。 # 除非你度过了特别漫长的一天，那样的话... 就该睡觉了！ self.machine.add_transition('清洁', '满身汗', '睡觉中', conditions=['筋疲力尽了吗']) self.machine.add_transition('清洁', '满身汗', '闲逛中') # 我们的嗜睡超级英雄几乎可以在任何时间睡着。 self.machine.add_transition('小睡', '*', '睡觉中') def 更新日志(self): """ 亲爱的日记，今天我救了胡须先生。又一次。 """ self.kittens_rescued += 1 @property def 筋疲力尽了吗(self): """ 基本上就是抛硬币。 """ return random.random() < 0.5 def 换上超级秘密战衣(self): print("帅吧？") 好了，现在你已经把一个状态机烘焙进了 嗜睡超级英雄。让我们带他/她/它出去遛遛... >>> 蝙蝠侠 = 嗜睡超级英雄("蝙蝠侠") >>> 蝙蝠侠.state '睡觉中' >>> 蝙蝠侠.唤醒() >>> 蝙蝠侠.state '闲逛中' >>> 蝙蝠侠.小睡() >>> 蝙蝠侠.state '睡觉中' >>> 蝙蝠侠.清洁() MachineError: "无法从状态 '睡觉中' 触发事件 '清洁'！" >>> 蝙蝠侠.唤醒() >>> 蝙蝠侠.锻炼() >>> 蝙蝠侠.state '饥饿中' # 蝙蝠侠还没干任何有用的事... >>> 蝙蝠侠.kittens_rescued 0 # 我们现在为您直播一场可怕的小猫被困事件现场... >>> 蝙蝠侠.求救信号() '帅吧？' >>> 蝙蝠侠.state '拯救世界' # 回基地。 >>> 蝙蝠侠.完成任务() >>> 蝙蝠侠.state '满身汗' >>> 蝙蝠侠.清洁() >>> 蝙蝠侠.state '睡觉中' # 太累了，澡都不洗了！ # 又是高效的一天，阿尔弗雷德。 >>> 蝙蝠侠.kittens_rescued 1 虽然我们无法读懂真正蝙蝠侠…