有限状态机(Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。FSM是一种算法思想,简单而言,有限状态机由一组状态、一个初始状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成。现实世界中存在大量具有有限个状态的系统:钟表系统、电梯系统、交通信号灯系统、通信协议系统、正则表达式、硬件电路系统设计、软件工程,编译器等,有限状态机的概念就是来自于现实世界中的这些有限系统。

transitions是一个由Python实现的轻量级的、面向对象的有限状态机框架。

transitions最基本的用法如下:

先自定义一个类Matter

定义一系列状态和状态转移(定义状态和状态转移有多种方式,官网上给了最快速理解的一个例子)

初始化状态机

4.获取当前的状态或者进行转化

from transitions import Machine

class Matter(object):

pass

model = Matter()

#The states argument defines the name of states

states=['solid', 'liquid', 'gas', 'plasma']

# The trigger argument defines the name of the new triggering method

transitions = [

{'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' },

{'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas'},

{'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas'},

{'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma'}]

machine = Machine(model=model, states=states, transitions=transitions, initial='solid')

# Test

print(model.state) # solid

model.melt()

print(model.state) # liquid

model.evaporate()

print(model.state)

上面那个例子是物体的几个状态的转换,如下图:

状态变化图.png

当然transitions库还有更高阶一点的用法,比如直接显示出图形,官网上是说可以用pygraphviz 来显示,但是本身pygraphviz 在windows上有一些问题,所以没有试验成功,等以下问题修复后准备再次尝试。

https://github.com/pytransitions/transitions/issues/258

可能有的同学好奇这个transitions库对于我们测试有什么帮助呢?

大家还记得测试设计方法中有一种称之为 状态迁移法 么?其实在设计测试用例的时候,需要在各种状态之间迁移并且最好能够做到随机的处理。

这部分状态迁移的测试用例在自动化的时候,Transitions库能在这方面对我们有一定的帮助。

from transitions import Machine

class AModel(object):

def __init__(self):

self.sv = 0 # state variable of the model

self.conditions = { # each state

'sA': 0,

'sB': 3,

'sC': 6,

'sD': 0,

}

def poll(self):

if self.sv >= self.conditions[self.state]:

self.next_state() # go to next state

else:

getattr(self, 'to_%s' % self.state)() # enter current state again

def on_enter(self):

print('entered state %s' % self.state)

def on_exit(self):

print('exited state %s' % self.state)

# setup model and state machine

model = AModel()

# init transitions model

list_of_states = ['sA', 'sB', 'sC', 'sD']

machine = Machine(model=model, states=list_of_states, initial='sA',

ordered_transitions=True, before_state_change='on_exit',

after_state_change='on_enter')

# begin main

for i in range(0, 10):

print('iter is: ' + str(i) + " -model state is:" + model.state)

model.sv = i

model.poll()

上面这段代码执行的时候的效果如下:

iter is: 0 -model state is:sA

exited state sA

entered state sB

iter is: 1 -model state is:sB

exited state sB

entered state sB

iter is: 2 -model state is:sB

exited state sB

entered state sB

iter is: 3 -model state is:sB

exited state sB

entered state sC

iter is: 4 -model state is:sC

exited state sC

entered state sC

iter is: 5 -model state is:sC

exited state sC

entered state sC

iter is: 6 -model state is:sC

exited state sC

entered state sD

iter is: 7 -model state is:sD

exited state sD

entered state sA

iter is: 8 -model state is:sA

exited state sA

entered state sB

iter is: 9 -model state is:sB

exited state sB

entered state sC

Transitions库的具体用法可以参照它的github项目(https://github.com/pytransitions/transitions),还有一些extensions也很有效的,这部分有时间以后会继续研究。

python 状态机库_Python的Transitions库实现有限状态机(FSM)相关推荐

  1. python 随机库_python随机库中的三个宝石

    python 随机库 Python is a batteries-included language, meaning it includes many many useful features in ...

  2. python accept解析_python中requests库使用方法详解

    一.什么是Requests Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤量的 ...

  3. python post 参数_python爬虫——requests库使用代理

    在看这篇文章之前,需要大家掌握的知识技能: python基础 html基础 http状态码 让我们看看这篇文章中有哪些知识点: get方法 post方法 header参数,模拟用户 data参数,提交 ...

  4. python扫描器爬虫_Python扫描器-常用库-Request

    1.常用库-Request 1.1. 介绍 #安装:pip3 install requests #各种请求方式:常用的就是requests.get()和requests.post() >> ...

  5. 怎样用python画雪花_python使用turtle库与random库绘制雪花

    本文实例为大家分享了python绘制雪花的具体代码,供大家参考,具体内容如下 代码非常容易理解,画着玩玩还是可以的.直接上代码 # -*- coding: utf-8 -*- "" ...

  6. python程序设计试卷_Python程序设计试题库

    < Python 程序设计>题库 一.填空题 第一章基础知识 1 . Python 安装扩展库常用的是 ________ 具.( pip ) 2 . Python 标准库 math 中用来 ...

  7. pip升级python包命令_python安装扩展库常用的是什么工具

    pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能. 目前如果你在 http://python.org 下载最新版本的安装包,则是已经自带了该工具. P ...

  8. python turtle用法_Python初学者Turtle库简介

    Python是一种基于文本的编程语言.为了使中小学生掌握这种语言,Turtle库(Turtle Library)是一个很好的起点.Turtle库是可用于创建插图和游戏的命令的集合. 什么是Python ...

  9. python图像对比_Python多种图像处理库的比较与比较

    我帮助在libvips wiki 上维护一个页面,比较20个左右的常用图像处理库,以便快速和内存使用,包括相当多的Python系统. 基准测试非常简单:加载5,000 x 5,000像素RGB TIF ...

最新文章

  1. QIIME 2教程. 26为QIIME 2开发新插件DevelopingPlugin(2021.2)
  2. 浏览器下载图片的方法,修改报文来实现。
  3. libcurl 域名解析分析
  4. C++模板剖析:函数模板、类模板解析
  5. ubuntu更改主机名
  6. “波斯公主选驸马”问题的理论分析和数学推导
  7. sumif单列求和_Sumif、Sumifs单列多条件求和
  8. 超声延时聚焦原理及算法仿真
  9. 计算机网络路由器的配置连接不上,路由器安装设置好后电脑还是不能上网解决办法...
  10. zotero导出所有的bib文件
  11. PTA:7-32 计算天数
  12. C++Error2208:...尝试引用已删除的函数
  13. 有什么助于睡眠的方法,睡眠不好,一定要知道这些方法
  14. win10“User Profile Service 服务未能登录,无法加载用户配置文件问题
  15. VBA将金额数字转成中文大写
  16. 刘宇辰java_大家帮忙取名字啊
  17. Spring中多语言页面适配方案总结
  18. Unity Editor修改分辨率
  19. YOLOv5系列(2)——YOLOv5导出jit,onnx,engine
  20. wget安装MySQL(5.6和5.7超详细版)

热门文章

  1. 2007年流行金曲精彩推荐
  2. 2020疫情期间软件代码安全领域你不得不了解的重要事件
  3. 什么对象都有prototype吗?
  4. 3:bond定价基础之收益率曲线
  5. php 返回400 bad request,400 bad request 手机怎么解决?
  6. 日期类计算器的实现以及运算符重载
  7. 使用cpio命令制作ramfs
  8. 修复浏览器报错 Error in mounted hook (Promise/async): “[object Object]“
  9. 如何将Word快速转为PPT?
  10. [Professor麦]总结Spring的设计模式