为正在运行的程序员提供自助有限状态机。

Automat的Python项目详细描述


为外出的程序员提供自助有限状态机。

automat是一个库,用于简洁、惯用的有限状态python表达式。 自动机(特别是确定性有限状态传感器)。

在此处或在 上阅读文档 ,或观看以下视频了解概述和演示

Glyph Lefkowitz在2017年2月21日第一次Pyninsula会议第一次会议上的概述和介绍:

glyph lefkowitz-automate-pyninsula 0

克林顿·罗伊于2017年8月6日在澳大利亚Pycon的演讲:

克林顿罗伊-州立机器-Pycon澳大利亚2017

为什么使用状态机?

有时你必须创建一个对象,它的行为会随着它的状态而变化, 但仍希望为其呼叫者提供一致的接口。

例如,假设您正在为咖啡机编写软件。它 有一个可以打开或关闭的盖子,一个水室,一个水室 咖啡豆和"冲泡"按钮。

咖啡机有许多可能的状态。它可能还是 可能没有水。它可能有也可能没有豆子。盖子可能打开了 或关闭。"brew"按钮实际上应该只尝试在 其中一种配置和"打开盖子"按钮只能在 事实上,咖啡不是酿造的。

通过勤奋和注意细节,您可以使用 对象上的属性集合; 有水 有豆 盖子是否打开 等等。但是,您必须保留所有这些属性 始终如一。当咖啡机变得越来越复杂时,也许您可以添加 额外的调味室,这样你可以做榛子咖啡 例子-你必须不断地增加越来越多的支票 关于允许哪些状态组合的推理。

而不是在每个方法中添加冗长的"if"检查来确保 这些标志中的每一个都是您所期望的,您可以使用状态机来 确保如果您的代码运行,它将运行所有必需的 值已初始化,因为必须按照声明的顺序调用它们 它们,

您可以阅读状态机及其对python程序员的优势 详细得多 在ClusterHQ的这一系列优秀文章中

是什么让自动机与众不同?

pypi上实现状态机的数十个库 。 因此,我有必要说为什么再来一个是个好主意。

自动机是围绕这个原则设计的:在组织代码时 状态机是个好主意,你的呼叫者不,也不应该,关心 你这么做了。在python中,有状态系统的"输入"是一个方法 调用;"output"可能是方法调用,如果需要调用副作用, 或者返回值,如果您只是在内存中执行计算。大多数 其他状态机库要求显式创建输入对象, 将该对象提供给通用的"input"方法,然后接收结果, 有时就库的接口而言,有时就 你定义自己的课程。

例如,可以实现上面的咖啡机示例的一个片段 在朴素的python中如下:

classCoffeeMachine(object):defbrew_button(self):ifself.has_waterandself.has_beansandnotself.is_lid_open:self.heat_the_heating_element()# ...

使用automat,您可以创建一个带有 methodicalmachine 属性的类:

fromautomatimportMethodicalMachineclassCoffeeBrewer(object):_machine=MethodicalMachine()

然后将上述逻辑分成两部分-brew按钮 输入 ,声明如下:

@_machine.input()defbrew_button(self):"The user pressed the 'brew' button."

但是,在此声明方法 body 没有任何好处,因为 输入方法在被调用时实际上并不执行它们的主体;实际执行 工作是输出的工作:

@_machine.output()def_heat_the_heating_element(self):"Heat up the heating element, which should cause coffee to happen."self._heating_element.turn_on()

以及几个 状态 只有两种状态是 有豆子 没有豆子

@_machine.state()defhave_beans(self):"In this state, you have some beans."@_machine.state(initial=True)defdont_have_beans(self):"In this state, you don't have any beans."

没有咖啡豆 是初始状态,因为咖啡机从没有咖啡豆开始 在里面,

(以及另一个输入来放入一些bean:)

@_machine.input()defput_in_beans(self):"The user put in some beans."

最后,使用函数的 方法将所有内容连接在一起 装饰有 _machine.state

# When we don't have beans, upon putting in beans, we will then have beans# (and produce no output)dont_have_beans.upon(put_in_beans,enter=have_beans,outputs=[])# When we have beans, upon pressing the brew button, we will then not have# beans any more (as they have been entered into the brewing chamber) and# our output will be heating the heating element.have_beans.upon(brew_button,enter=dont_have_beans,outputs=[_heat_the_heating_element])

不过,对于这个咖啡机类的用户来说,它仍然像一个popo (普通的旧python对象):

>>>coffee_machine=CoffeeMachine()>>>coffee_machine.put_in_beans()>>>coffee_machine.brew_button()

所有的 输入都是通过像方法一样调用它们来提供的,所有的 当根据 在 上指定为 的输出,并且所有状态都只是不透明的标记- 尽管它们被定义为像输入和输出这样的方法 允许您轻松地将docstring放在它们上以记录它们。

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

推荐PyPI第三方库


热门话题
java文件分块,获取长度字节   java嵌入式Tomcat不执行jsf页面   java我的数据库中有2个实体,但hibernate返回其中6个。   java如何基于逗号拆分字符串   java取消已经运行的CompletableFutures的预期模式是什么   java如何在informix中从另一个数据库复制表ddl和数据   为什么图片是黑色的?   java根据字符串数组中的单词筛选列表   Java8的集合。平行流有效吗?   Kotlin中的java静态内部类   java如何在GUI中生成一列字符串   javafx如何正确使用高对比度主题?   带空格的javascript Httpurlconnection参数   java如何设置GridBagLayout的约束   java如何在一个线程可能尚未初始化时关闭另一个线程   java将简单时间格式转换为特殊时间格式(hhmmt)   安卓/java阵列重复过滤器的问题   java在队列的链接实现下,入队和出队是如何工作的   java更新sql外键约束