根据我的经验,将转换(或更好的触发器)视为应根据当前状态进行处理的事件是一种很好的做法。例如,当您的机器处于该init状态时,stopping将不会处理该事件,并且 - 根据您的配置 - 甚至可能引发异常。
因此,与其“抑制”转换,不如将您的用例改写为“我的机器应该在状态下处理事件stop并且以不同的方式处理”。
按以下顺序评估潜在转换:downrunning_top_onPytransitions
- 在子级中定义的转换将在父级中定义的转换之前进行评估
- 状态中的转换按照它们添加的顺序进行评估
conditions只有在所有返回True和所有unless回调都返回时才会进行转换False
策略一:Handle down/ stopevents inrunning_top覆盖父母中的处理策略。
例如,您可以添加基本上什么都不做的内部转换:
state_config = {
'name': 'top',
'children': ['on', 'off'],
'initial': 'off',
'transitions': [['begin', 'off', 'on'],
['end', 'on', 'off'],
['down', 'on', None],
['stop', 'on', None]]
}

但是,当您的机器被指示停止时,即使它处于临界状态,您可能希望向转换添加一个回调以记录事件。
unless策略二:在你的过渡中引入。
transitions = [ # ...,
{'trigger': 'stop', 'source': 'running', 'dest': 'stopping', 'unless': 'is_running_top_on'}

很方便,在这种情况下,我们不必编写自定义条件回调,因为我们的模型已经装饰了状态检查功能。
策略 3:在通用转换之前添加处理特殊情况的转换。
transitions = [['start', 'init', 'running'],
['stop', 'running_top_on', None],
['stop', 'running', 'stopping']]
该图看起来像第一个图,但转换实际上将在根级别定义,这意味着仅当事件尚未由子状态处理时才会评估它。这意味着如果我们在这里添加,当处理在状态中定义为时['bottom', 'running_top_up', Nome]不会被调用。bottomrunning['bottom', 'top', 'down']