WEB开发网
开发学院软件开发Python 可爱的 Python: 用基于生成器的状态机和协同程序增... 阅读

可爱的 Python: 用基于生成器的状态机和协同程序增加效率

 2007-03-29 12:05:22 来源:WEB开发网   
核心提示: 回忆状态机在“可爱的 Python”前面的另一篇文章中,我介绍了 StateMachine 类 ,可爱的 Python: 用基于生成器的状态机和协同程序增加效率(2),给定的机器需要多少状态处理程序,它就允许用户添加多少状态处理程序,我们将看看另一种用生成器实现相同

回忆状态机

在“可爱的 Python”前面的另一篇文章中,我介绍了 StateMachine 类 ,给定的机器需要多少状态处理程序,它就允许用户添加多少状态处理程序。在模型中,将一个或多个状态定义为终态(end state),仅将一个状态定义为初始状态(start state)(调用类方法对此进行配置)。每个处理程序都有某种必需的结构;处理程序将执行一系列操作,然后过一会儿,它带着一个标记返回到 StateMachine.run() 方法中的循环内,该标记指出了想得到的下一个状态。同样,用 cargo 变量允许一个状态把一些(未处理的)信息传递给下一个状态。

我介绍的 StateMachine 类的典型用途是以一个有状态的方式使用输入。例如,我所用的一个文本处理工具(Txt2Html)从一个文件中读取数行内容;依据每行所属的类别,需要以特殊的方式对其进行处理。然而,您经常需要看看前面几行提供的上下文来确定当前行属于哪个类别(以及应该怎样处理它)。构建在 StateMachine 类上的这个过程的实现可以定义一个 A 处理程序,该处理程序读取几行,然后以类似 A 的方式处理这些行。不久,满足了一个条件,这样下一批的几行内容就应该由 B 处理程序来处理了。 A 把控制传递回 .run() 循环,同时指示切换到 B 状态 ― 以及任何 A 不能正确处理的、 B 应该在阅读额外的几行之前处理的额外的行。最后,某个处理程序将它的控制传递给某个被指定为终态的状态,处理停止(halt)。

对于前面一部分中的具体代码示例,我使用了一个简化过的应用程序。我处理由迭代函数产生的数字流,而不是处理多行内容。每个状态处理程序仅打印那些在期望的数字范围内的数字(以及关于有效状态的一些消息)。当数字流中的一个数字传到一个不同的范围内,另一个不同的处理程序就会接管“处理”。对于这一部分,我们将看看另一种用生成器实现相同数字流处理的方式(有一些额外的技巧和功能)。但是,一个更复杂的生成器示例有可能对更象上一段中提到的输入流进行处理。我们再来看看前一个状态机删减过代码的版本:

上一页  1 2 3 4 5 6 7  下一页

Tags:可爱 Python 基于

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接