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

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

 2007-03-29 12:05:22 来源:WEB开发网   
核心提示: 关于基于生成器的状态机,要研究的地方还很多,可爱的 Python: 用基于生成器的状态机和协同程序增加效率(5),第一点在很大程度上是表面性的,我们安排 stategen_test.py 只能使用函数,尽管可能用处不大,但是您姑且听听,不能使用类(至少按我的意思,生成器更有一种函数编程的感

关于基于生成器的状态机,要研究的地方还很多。第一点在很大程度上是表面性的。我们安排 stategen_test.py 只能使用函数,不能使用类(至少按我的意思,生成器更有一种函数编程的感觉而非面向对象编程(OOP)的感觉)。但是,如果希望的话,您可以很容易地把相同的通用模型包装到一个或多个类中。

我们的样本中的主函数是 scheduler() ,它完全是一般性的(但是比前面的模式中的 StateMachine 要短许多)。函数 scheduler() 要求生成器-迭代器对象字典(“实例化的”生成器)作为参数。给每个生成器取的字符串名称可以是您所希望的任意名称 ― 生成器工厂函数的字面名称是一个显而易见的选择,但是我在示例中使用大写的关键字名称。 scheduler() 函数还接受“初始状态”作为参数,但如果您希望的话,也许可以自动选择一个缺省值。

每个“已调度的”生成器遵循一些简单的惯例。每个生成器运行一段时间,然后产生一对值,包含期望的跳转和某个“cargo” ― 就像用前面的模型一样。没有生成器被明确地标记为“终态”。相反,我们允许各个生成器选择产生错误来结束 scheduler() 。特殊情况下,如果生成器“离开”终态或者到达一个 return 状态,生成器将产生 StopIteration 异常。如果需要的话,您可以捕获这个异常(或者是一个不同的异常)。在我们的例子中,我们使用 sys.exit() 来终止应用程序,在 exit() 生成器中会遇到这个 sys.exit()。

要注意关于代码的两个小问题。上面的样本使用一个更简洁的循环生成器-迭代器,而不是使用迭代函数来生成我们的数字序列。生成器仅随着每个后续的调用发出一个(无穷的/不确定的)数字流,而不是连续返回“最后的值”。这是一个虽然小但却好用的生成器样本。而且,上面把“状态转换”隔离在了一个单独的函数中。在实际程序中,状态转变跳转更是上下文相关的,而且可能要在实际的生成器体内决定。该途径简化了样本。尽管可能用处不大,但是您姑且听听,我们完全可以通过一个函数工厂产生生成器函数从而进一步简化;但是一般情况每个生成器都不会与其它生成器相似到足以使这种方法切实可行。

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

Tags:可爱 Python 基于

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