我正在使用 Python 的转换库,我发现它非常有用。在我的特定情况下,我使用 FSM 在状态内(在回调中)做出决策,并相应地根据内部逻辑调用新的转换。例如:
states = ["Begin", "CheckCondition", "MakeA", "MakeB", "End"]
transitions = [
["proceed", "Begin", "CheckCondition"],
["path_a", "CheckCondition", "MakeA"],
["path_b", "CheckCondition", "MakeB"],
["proceed", "MakeA", "End"],
["proceed", "MakeB", "End"]
]
class MyModel:
def __str__(self):
return f">>>>> STATE: {self.state}"
def on_enter_CheckCondition(self):
if random.randint(1, 10) > 5:
self.path_a()
return
else:
self.path_b()
return
my_model = MyModel()
machine = HierarchicalGraphMachine(
model=my_model,
states=states,
transitions=transitions,
initial="Begin",
ignore_invalid_triggers=False
)
while my_model.state != "End":
my_model.proceed()
这种方法将所有逻辑保留在 FSM 中,这正是我想要的,但有两个缺点:
- 我可能有一个无限的调用链,这会导致堆栈溢出(只有
proceed()转换,while循环调用,会中断它) - 我必须记住
return在从回调调用任何转换后手动调用
有没有更好的方法来使用转换库来实现我想要的(从回调调用转换)?
感谢帮助!