在模型中,将一个或多个状态定义为终态(end state),仅将一个状态定义为初始状态(start state)(调用类方法对此进行配置)。每个处理程序都有某种必需的结构;处理程序将执行一系列操作,然后过一会儿,它带着一个标记返回到 StateMachine.run() 方法中的循环内,该标记指出了想得到的下一个状态。同样,用 cargo 变量允许一个状态把一些(未处理的)信息传递给下一个状态。
我介绍的 StateMachine 类的典型用途是以一个有状态的方式使用输入。例如,我所用的一个文本处理工具(Txt2Html)从一个文件中读取数行内容;依据每行所属的类别,需要以特殊的方式对其进行处理。然而,您经常需要看看前面几行提供的上下文来确定当前行属于哪个类别(以及应该怎样处理它)。构建在 StateMachine 类上的这个过程的实现可以定义一个 A 处理程序,该处理程序读取几行,然后以类似 A 的方式处理这些行。不久,满足了一个条件,这样下一批的几行内容就应该由 B 处理程序来处理了。 A 把控制传递回 .run() 循环,同时指示切换到 B 状态 ― 以及任何 A 不能正确处理的、 B 应该在阅读额外的几行之前处理的额外的行。最后,某个处理程序将它的控制传递给某个被指定为终态的状态,处理停止(halt)。
对于前面一部分中的具体代码示例,我使用了一个简化过的应用程序。我处理由迭代函数产生的数字流,而不是处理多行内容。每个状态处理程序仅打印那些在期望的数字范围内的数字(以及关于有效状态的一些消息)。当数字流中的一个数字传到一个不同的范围内,另一个不同的处理程序就会接管“处理”。对于这一部分,我们将看看另一种用生成器实现相同数字流处理的方式(有一些额外的技巧和功能)。但是,一个更复杂的生成器示例有可能对更象上一段中提到的输入流进行处理。我们再来看看前一个状态机删减过代码的版本:
清单 1. statemachine_test.py