python状态机transitions库详解
作者:sandalphon4869 发布时间:2021-07-14 15:52:16
一、简介
transitions库
pip install transitions
状态机
state:状态节点
transition:用于从一个状态节点移动到另一个状态节点
教程
https://pypi.org/project/transitions/
二、逐步创建
创建对象
创建一个继承object
的类Number
的实体对象number
,然后调用transitions.Machine()
将状态机绑定到这个实体对象上。
from transitions import Machine
class Number(object):
pass
number = Number()
machine = Machine(model=number)
然后我们得到了两个东西,一个是状态机machine
,一个是具体的实体对象number
,。
之后设定状态机是用machine
,运行状态机是用具体的实体对象number
。
添加state
state可以指定:
name
:状态节点的名字,必须指定。on_enter
:进入该状态节点会产生的事件(注意,初始节点不会调用,因为已经进入了。见【验证代码】)on_exit
:退出该状态节点会产生的事件
'''
构造简单的state
'''
# 只指定名字
zero = '0'
# 通过State()
from transitions import State
one = State('1')
# 构造字典
two = {'name':'2'}
'''
构造复杂的State
'''
class Number(object):
def hello(self):
print('hello')
pass
zero = '0'
from transitions import State
one = State('1', on_enter=['hello'], on_exit=['hello'])
two = {'name':'2', 'on_enter':['hello'], 'on_exit':['hello']}
'''
添加state
'''
# 逐个
machine.add_states(zero)
# 一起添加
machine.add_states([one, two])
添加transition
transition需要指定三个东西:
trigger
:表示transition的名字(注意,不能和Number
类中方法重名了)source
:原状态节点dest
:目标转态节点
machine.add_transition('zero_to_one', source='0', dest='1') # 有效
machine.add_transition('zero_to_one', source='1', dest='2') # 无效
注意,只有第一个匹配zero_to_one
的transition有效。因此,上面最后一行中定义的转换不会做任何事情。
三、直接初始化创建
states = [
{'name':'0'},
{'name':'1'},
{'name':'2', 'on_enter':['hello'], 'on_exit':['hello']},
]
# way1
transitions = [
{ 'trigger': 'zero_to_one', 'source': '0', 'dest': '1' },
{ 'trigger': 'zero_to_two', 'source': '0', 'dest': '2' },
{ 'trigger': 'one_to_two', 'source': '1', 'dest': '2' },
{ 'trigger': 'any_to_zero', 'source': '*', 'dest': '0' }, # 任意前状态 '*'
]
# way2
transitions = [
['zero_to_one', '0', '1' ],
['one_to_two', '1', '2' ],
['any_to_zero', '*', '0' ], # 任意前状态 '*'
]
from transitions import Machine
class Number(object):
def hello(self):
print('hello')
pass
number = Number()
machine = Machine(
model=number,
states=states,
initial=states[0]['name'],
transitions=transitions
)
四、运行
输出当前状态
now_state = number.state
print(now_state)
判断当前状态
格式:is_«state name»()
。返回True False。
number.is_0()
强行移动状态
格式:to_«state name»()
。返回True;如果移动到不存在的状态节点从而失败,那么抛出AttributeError
。
number.to_2()
获取到某个状态的transition
machine.get_triggers('0')
# ['to_0', 'to_1', 'to_2', 'zero_to_one', 'any_to_zero']
调用transition
# way 1
number.zero_to_one()
# way 2
number.trigger('zero_to_one')
附录
什么叫做初始状态已经进入
from transitions import Machine
class Number(object):
def hello(self):
print('hello')
pass
number = Number()
states = [
{'name':'0', 'on_enter':['hello']},
{'name':'1'},
{'name':'2'},
]
transitions = [
{ 'trigger': 'zero_to_one', 'source': '0', 'dest': '1' },
{ 'trigger': 'zero_to_two', 'source': '0', 'dest': '2' },
{ 'trigger': 'one_to_two', 'source': '1', 'dest': '2' },
{ 'trigger': 'any_to_zero', 'source': '*', 'dest': '0' }, # 任意前状态 '*'
]
Machine(model=number, states=states, initial=states[0]['name'],transitions=transitions)
init_state = number.state
print(init_state)
number.zero_to_one()
print(number.state)
number.any_to_zero()
print(number.state)
'''
0# 第一次不会调用,因为已经进入了
1
hello# 再进来时才调用
0
'''
来源:https://blog.csdn.net/sandalphon4869/article/details/117336787


猜你喜欢
- 🔓一. CRUDCRUD : Create,Retrieve,Update,Delete新增数据查询数据修改数据删除数据MySQL的工作就是
- 最近脱离了googlecolab想使用本地的anaconda进行机器学习课题的演练,在安装tensorflow时报错 : Unsatisfi
- 写完调用天气接口的demo之后,小程序调用天气接口并且渲染在页面,顺便再调用了一下美图的接口API:美图APIurlwxml:<vie
- 方式一在Python的SQLAlchemy ORM中,您可以使用以下代码动态地更改数据模型类的表名:from sqlalchemy.ext.
- 前言我最近喜欢去听情感类的节目,比如说,婚姻类,我可能老了吧。我就想着怎么把音乐下载下来了,保存到手机上,方便我们业余时间去听。发送请求首先
- wheel文件Wheel和Egg都是python的打包格式,目的是支持不需要编译或制作的安装过程,实际上也是一种压缩文件,将.whl的后缀改
- 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表中的d 进行排序,可d的定义为varchar
- 尽管 JavaScript 历史上使用冗长而令人生厌的代码块来标的特定浏览器的时期已经结束了,但是偶尔使用一些简单的代码块和对象检测来确保一
- 根据不同配置文件调用不同的验证函数检查输入。可以根据需求更改验证函数的逻辑。def VerifyData(func):  
- HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HTTP请求/响应操作就需要重新建
- Python+matplotlib进行鼠标交互,实现动态标注,数据可视化显示,鼠标划过时画一条竖线并使用标签来显示当前值。Python3.6
- 使用了telnetlib模块,首先登录到交换机,列出并获取配置文件的名称,然后通过tftp协议将配置文件传输到文件服务器上,为避免配置文件覆
- xlsxwriter 简介用于以 Excel 2007+ XLSX 文件格式编写文件,相较之下 PhpSpreadsheet 支持更多的格式
- 在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范
- 经过一轮的项目封闭开发,页面制作的动手能力提高了不少,用AW的话说就是被复杂的东西虐过以后很多问题都变得容易了,的确很有道理。我个人觉得技术
- set oSQLServer =server.createobject("SQLDMO.SQLServer")oSQLS
- 随着网络的发展,越来越多的网络平台应运而生。如何获得更多的流量,吸引更多的眼球已经成为网络平台生存、发展的必要条件。现在网络平台最常见的一种
- 本文实例为大家分享了python实现汉诺塔游戏的具体代码,供大家参考,具体内容如下一.汉诺塔汉诺塔问题是一个经典的递归问题,对于这个问题,我
- 今天在使用MySQL时却不知如何处理,插入记录后不知怎样获得刚刚插入的id,查过文档后发现了select last_insert_id(),
- 这个分页使用的是0游标,也就是Rs.Open Sql,Conn,0,1。但是感觉也快不了多少,10万条数据的分页时间300多豪秒之间。风格A