流动性: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是必须调用的方法 启动转换。此方法由流动性自动创建 引擎。

转换可以有可选的actionguard参数。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

如何运行测试

只需运行:

make test

用于安装所有测试依赖项(Should-DSL) 以及Specloud,目前)和 运行测试。流动性本身没有依赖性。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Hibernate:jpamodelgen生成java而不是类   java如何在第二次活动结束后显示广告?   javascript如何在linux或windows上将java导出到jar   java One ArrayList添加了2个不同的选项   AmazonWeb服务如何在java中使用AWS Textract检索pdf中存在的表   java为什么RecycleView中的水平项在单击时不起作用?   java计算如果存在映射   java在捕获的组上应用正则表达式   如何使用Java在MySQL的同一个表中插入来自不同类的值   java字符串中最常见的字母(大写和小写)   Spring SessionBean实例正在由java中的多个用户共享   使用Spring Boot将@WebInitParam中的值外部化   java一创建线程就开始执行(多线程)   java是安卓所需的系统权限。意图行动给你打电话?