流动性:python对象的状态机实现
fluidity-sm的Python项目详细描述
python对象的状态机实现。
如何使用
一个非常简单的例子摘自specs:
from fluidity import StateMachine, state, transition class SimpleMachine(StateMachine): initial_state = 'created' state('created') state('waiting') state('processed') state('canceled') transition(from_='created', event='queue', to='waiting') transition(from_='waiting', event='process', to='processed') transition(from_=['waiting', 'created'], event='cancel', to='canceled')
“一个稍微复杂一点的例子”
为了演示更高级的功能,下面使用fluity复制了一个来自AASM(ruby最流行的状态机实现)的“稍微复杂一点的示例”:
from fluidity import StateMachine, state, transition class Relationship(StateMachine): initial_state = lambda relationship: relationship.strictly_for_fun() and 'intimate' or 'dating' state('dating', enter='make_happy', exit='make_depressed') state('intimate', enter='make_very_happy', exit='never_speak_again') state('married', enter='give_up_intimacy', exit='buy_exotic_car_and_buy_a_combover') transition(from_='dating', event='get_intimate', to='intimate', guard='drunk') transition(from_=['dating', 'intimate'], event='get_married', to='married', guard='willing_to_give_up_manhood') def strictly_for_fun(self): pass def drunk(self): pass def willing_to_give_up_manhood(self): return True def make_happy(self): pass def make_depressed(self): pass def make_very_happy(self): pass def never_speak_again(self): pass def give_up_intimacy(self): pass def buy_exotic_car_and_buy_a_combover(self): pass
状态
流动状态机必须有一个初始状态和至少两个状态。
一个状态可能已经进入和退出回调,用于在状态输入上运行一些代码 并分别退出。这些参数可以是方法名(作为字符串)。 可调用的,或方法名或可调用的列表。
过渡
转换将机器从一种状态引导到另一种状态。转换必须具有 从{eem>,到,以及操作参数。from{eem>是一个或多个(作为列表)状态 从中可以开始转换。to是 过渡将引导机器。event是必须调用的方法 启动转换。此方法由流动性自动创建 引擎。
转换可以有可选的action和guard参数。action是 启动转换时将调用的方法(或可调用的)。如果 参数被传递给event方法,它们被传递给action 方法,如果它接受这些参数。guard是一个 调用以允许或拒绝转换,具体取决于 执行。“action”和guard都可以是列表。
同一事件可以处于多个转换中,进入不同的状态,具有 他们各自的卫兵作为挑选者。对于具有相同事件的转换, 一次只能有一个守卫返回一个真实值。
个性化
状态和转换是以类范围模式定义的。但是,我们可以定义 单个对象的状态和转换。例如,将“门”作为 状态机:
door.add_state('broken') door.add_transition(from_='closed', event='crack', to='broken')
这些添加仅影响目标对象。
如何安装
只需运行:
pip install fluidity-sm
note:pypi包名为fluity sm,而不是fluity。