pytransitions 0.8+版本中正确使用Nested states的方法是什么
pytransitions多层嵌套状态(macro-state)实现说明
结论
pytransitions 0.8及以上版本原生支持多层嵌套的macro-state,完全可以实现你描述的层级结构,无需强制使用旧版本的兼容工作流。
核心实现逻辑
pytransitions的状态定义支持通过children字段为任意状态添加子状态,嵌套层级没有限制,你描述的「蓝色父状态包含两个子状态,其中绿色子状态本身也是包含内部状态的macro-state」结构可以直接通过多层嵌套的状态配置实现。
示例代码
from transitions import Machine # 定义状态结构,完全匹配你要求的层级 states = [ "standby", # 示例根状态 # 蓝色macro-state(父状态) { "name": "blue_block", "children": [ # 绿色macro-state(蓝色的子状态,本身也是父状态) { "name": "green_block", "children": ["green_sub1", "green_sub2"], # 绿色的两个内部状态 "initial": "green_sub1" # 绿色状态的默认初始子状态 }, "blue_sub2" # 蓝色的第二个子状态 ], "initial": "green_block" # 蓝色状态的默认初始子状态 }, "completed" # 示例根状态 ] # 定义状态转换规则,可根据需求自定义 transitions = [ ["start", "standby", "blue_block"], ["switch_blue_sub", "blue_block_green_block", "blue_block_blue_sub2"], ["switch_green_sub", "blue_block_green_block_green_sub1", "blue_block_green_block_green_sub2"], ["finish", "blue_block", "completed"] ] # 实例化状态机 class StateMachineDemo: pass demo = StateMachineDemo() machine = Machine(demo, states=states, transitions=transitions, initial="standby") # 测试运行 demo.start() print(demo.state) # 输出 blue_block_green_block_green_sub1 demo.switch_green_sub() print(demo.state) # 输出 blue_block_green_block_green_sub2 demo.switch_blue_sub() print(demo.state) # 输出 blue_block_blue_sub2
补充说明
- 嵌套状态的完整状态名默认会按照
父状态名_子状态名的规则拼接,你也可以通过配置auto_transitions=False关闭自动生成的转换规则,完全自定义状态流转逻辑。 - 所有嵌套状态都继承父状态的转换规则,符合分层状态机的标准语义。
内容的提问来源于stack exchange,提问作者Red Karibou
相关产品推荐
相关产品推荐

