gpt4 book ai didi

另一种方式的python FSM Fysom回调

转载 作者:太空狗 更新时间:2023-10-30 03:02:05 26 4
gpt4 key购买 nike

我正在使用 Fysom 创建 FSM。我想以其他方式使用回调:

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

fsm = Fysom(TABLE)

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

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

def _enter_state(self, e):
'''
Executes the callback for onenter_state_ or on_state_.
'''
for fnname in ['onenter' + e.dst, 'on' + e.dst]:
if hasattr(self, fnname):
return getattr(self, fnname)(e)

我不知道如何为了我的目的而改变这种平静的代码。

最佳答案

如果不触及 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

关于另一种方式的python FSM Fysom回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23134097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com