【问题标题】:State history in PytransitionsPytransitions 中的状态历史
【发布时间】:2021-07-20 14:43:26
【问题描述】:

我正在使用Pytransitions,并且我有一些状态机,例如

from transitions import Machine
from transitions import EventData


class Matter(object):
    def __init__(self):
        transitions = [
            {'trigger': 'heat', 'source': 'solid', 'dest': 'liquid'},
            {'trigger': 'heat', 'source': 'liquid', 'dest': 'gas'},
            {'trigger': 'cool', 'source': 'gas', 'dest': 'liquid'},
            {'trigger': 'cool', 'source': 'liquid', 'dest': 'solid'}
        ]
        self.machine = Machine(
                model=self,
                states=['solid', 'liquid', 'gas'],
                transitions=transitions,
                initial='solid',
                send_event=True
        )

    def on_enter_gas(self, event: EventData):
        print(f"entering gas from {event.transition.source}")

    def on_enter_liquid(self, event: EventData):
        print(f"entering liquid from {event.transition.source}")

    def on_enter_solid(self, event: EventData):
        print(f"entering solid from {event.transition.source}")

是否有一些库支持的方式来跟踪所有状态的历史?

我现在手动做的是初始化:

after_state_change=lambda event: self._on_after_state_change(event)

def _on_after_state_change(self, event: EventData):
    to_state = event.transition.dest
    self._history_df.append({
        "start_index": self._index,
        "state": to_state
    }, ignore_index=True)

我想知道该库是否支持某些可查询日志记录,这意味着不仅可以将事件转储到文件中,还可以将它们保存在列表中。

【问题讨论】:

    标签: python state-machine pytransitions


    【解决方案1】:

    Transitions 没有内置历史记录。如果您只想跟踪以前的状态,this GitHub 问题可能会有所帮助:

    由于具有转换的有状态对象是模型,因此您可以使用 state 属性来跟踪状态变化:

    from transitions import Machine
    import collections
    
    
    # if you like your machine to act as a model, let Model inherit from Machine
    class Model(object):
    
        def __init__(self, history_length):
            self.state_history = collections.deque(maxlen=history_length)
    
        @property
        def state(self):
            return self.state_history[-1]
    
        @state.setter
        def state(self, value):
            self.state_history.append(value)
    
    
    model = Model(3)
    machine = Machine(model, states=['A', 'B', 'C', 'D'], initial='A')
    print(model.state)  # >>> A
    
    model.to_B()
    model.to_C()
    model.to_A()
    model.to_D()
    
    print("->".join(model.state_history))  # >>> C->A->D
    

    这仅适用于model_attribute='state'(默认值)。如果您更改了“有状态”模型字段的名称,则需要相应地调整上述属性。

    如果您对所有EventData 感兴趣,您的方法似乎是解决方案。不过,您可以省略 lambda。 after_state_change=self._on_after_state_changeafter_state_change='_on_after_state_change'(如果方法是模型的一部分)应该足够了。

    上面提到的dequeue(或queue.Queue)是“可查询的”,您可以使用过滤器或列表推导。如果您需要更复杂的东西,pandas(考虑到您的历史名称,您可能已经使用过)或sqlite 可能更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多