有限事务状态机。
ftsm的Python项目详细描述
有限事务状态机
有限事务状态机是一种事务驱动的有限状态机。 事务可以是异常时还原的任何python可调用对象。 发生。
安装
pip3 install ftsm
它是如何工作的?
- 创建状态和可能的转换列表允许状态
过渡到。
UNLOCKED=State('UNLOCKED',initial=True,allowed_transitions=['LOCKED'])LOCKED=State('LOCKED',initial=False,allowed_transitions=['UNLOCKED'])
- 初始化过渡状态机。
tsm=TransactionalFiniteStateMachine(name='Lock')
- 将定义的状态添加到状态机。
tsm.add(LOCKED)tsm.add(UNLOCKED)
- 创建事务并定义带或不带条件的回滚事务。
t1=Transaction(target=func,args=('name',),rb_transactions=[t2],rb_conditions=[ExceptionCondition(KeyError)])
- 使用事务转换到新状态。
withtsm.managed_transition(state=LOCKED,pre_transactions=[t1,t3],on_error_transactions=[t4],post_transactions=[t5]):func()
示例
fromftsmimportState,Transaction,TransactionalFiniteStateMachineclassLightController:defturn_off_light(self,room):print('turning the {} room light off.'.format(room))defturn_on_light(self,room):print('turning the {} room light on.'.format(room))light_controller=LightController()defturn_off_water():print('turning off the water.')defturn_on_water():print('turning on the water.')defwater_plants():print('watering the plants.')deflock_the_door():print('locking the door.')defunlock_the_door():print('unlocking the door.')UNLOCKED=State('UNLOCKED',initial=True,allowed_transitions=['LOCKED'])LOCKED=State('LOCKED',initial=False,allowed_transitions=['UNLOCKED'])tsm=TransactionalFiniteStateMachine(name='Lock')tsm.add(LOCKED)tsm.add(UNLOCKED)light_transaction=Transaction(target=light_controller.turn_off_light,args=('Living',),rb_transactions=[Transaction(target=light_controller.turn_on_light,args=('Living',))])water_transaction=Transaction(target=turn_off_water,rb_transactions=[Transaction(target=turn_on_water)])withtsm.managed_transition(state=LOCKED,pre_transactions=[light_transaction,water_transaction],on_error_transactions=[Transaction(unlock_the_door)],post_transactions=[Transaction(water_plants)]):lock_the_door()print(tsm.current_state)
上面的示例代码将导致以下输出。
turningtheLivingroomlightoff.turningoffthewater.lockingthedoor.wateringtheplants.<Statename=LOCKEDinitial=False>
如果在执行事务时发生错误,则执行还原事务 以相反的顺序,不会发生状态转换。
还可以使用ExceptionCondition
使回滚事务成为条件事务。
提供类。
light_transaction = Transaction(
target=light_controller.turn_off_light,
args=('Living',),
rb_transactions=[
Transaction(target=light_controller.turn_on_light,
args=('Living',))
],
rb_conditions=[ExceptionCondition(KeyError)])
只有在 交易执行。
用户可以将抽象Condition
类扩展到定义的新条件。