另一方面,python FSM Fysom回调

2024-10-02 08:25:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Fysom创建FSM。 我想用另一种方式使用回调:

TABLE = {
'initial': 'OFF',
'events': [{'name': 'load', 'src': 'OFF', 'dst': 'LOADED'},],
'callbacks': {'onload': myfunction,}}

fsm = Fysom(TABLE)

在这里,如果我启动fsm.onload(),它将执行myfunction。相反,我想如果我启动myfunction(),它将使用fsm.onload()。在

我看了一下剧本,相关部分在这里:

^{pr2}$

我不知道如何为我的目的改变代码的和平。在


Tags: namesrc方式tableloadeventsinitialdst
1条回答
网友
1楼 · 发布于 2024-10-02 08:25:41

如果不接触myfunction,则无法实现“反方向”回调。 回调实际上是一个反向调用(hollywood principle),因此回调的反向调用是一个简单的调用。在

这意味着myfunction应该直接调用状态机转换。因此,状态机对象必须在myfunction的范围内。在

在这一点上,您有一些实现的可能性:

  • 使myfunction成为一个闭包:

    def outer():
        fsm = Fysom(TABLE)
        def myfunction():
            print("I call the state machine transition when called")
            fsm.onload()
        return fsm
    
  • 在类中使用全局状态机或对其进行作用域:

    class Foo(object):
    
        def __init__(self):
            self.fsm = Fysom(TABLE)
    
        def my_method(self):
            self.fsm.onload()
    
  • 创建一个在执行函数之前/之后调用状态转换方法的decorator。然后用

    fsm = Fysom(TABLE)
    
    @transition(fsm, "onload")
    def myfunction():
        pass
    

    注意,这还需要在此范围中定义fsm

相关问题 更多 >

    热门问题