pytransitions 中的终端/接收器状态

例如,我将 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': '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}")

我想添加一个状态,任何触发器都保持在同一状态,不调用转换,不显式指定每个可能的触发器,也不忽略所有无效的触发器(因为这非常有利于调试) .

例如,我想要一个状态 crystal,它可以通过从 crystalize 触发 liquid 来达到,对此任何事件都不做任何事情。

这可以通过图书馆实现吗?

表达这个问题的另一种方式是ignore_invalid_triggers=True 仅针对特定状态,而不是所有状态。

dalanmao007 回答:pytransitions 中的终端/接收器状态

与转换类似,状态也可以用字典定义:

from transitions import Machine,MachineError


class Matter(object):
    def __init__(self):
        transitions = [
            {'trigger': 'heat','source': 'solid','dest': 'liquid'},{'trigger': 'heat','source': 'liquid','dest': 'gas'},{'trigger': 'cool','source': 'gas','dest': 'solid'},# add a transition to 'crystal' which is valid from anywhere
            {'trigger': 'crystallize','source': '*','dest': 'crystal'},]
        self.machine = Machine(
                model=self,states=['solid','liquid','gas',# initialized 'crystal' with dictionary
                        {'name': 'crystal','ignore_invalid_triggers': True}],transitions=transitions,initial='solid',send_event=True
        )


m = Matter()
assert m.is_solid()
try:
    m.cool()  # raises a machine error since cool cannot be called from 'solid'
    assert False
except MachineError:
    pass
assert m.crystallize()  # transitions to 'crystal'
assert m.is_crystal()
assert not m.heat()  # note that the transition will return 'False' since it did not happen but no exception was thrown
assert m.is_crystal()  # state machine is still in state 'crystal'

您也可以传递 {'name': 'crystal','ignore_invalid_triggers': True} 代替 State(name='crystal',ignore_invalid_triggers=True)documentation's state section 中提到了这种形式:

但在某些情况下,您可能希望默默地忽略无效的触发器。您可以通过设置 ignore_invalid_triggers=True(逐个州或全局所有州)来实现此目的:

,

我最终做的是在机器已经用它的转换实例化之后:

self.machine.get_state(states.crystal.name).ignore_invalid_triggers = True

我真的不喜欢那个解决方案,因为它破坏了将转换初始化作为列表的非常简洁的设计,但我只能找到它并且它确实有效。

本文链接:https://www.f2er.com/36602.html

大家都在问