一、Iterator在 Rasa源码中的运用及自定义实现示例
任何对象只要实现了iter()和next()方法,就是实现了iterable接口,这样做的目的是返回这个数据对象所包含的所有的元素。Iterable对象既可以表示为有限的数据源也可以表示为无限的数据源。一个iterable对象会直接或者间接定义以下两个方法:
__iter()__,这个方法必须返回iterator对象
__next()__,使用iterator对象来进行调用,获取下一个值
下面是在Rasa核心组件form源码中的一个运用示例,作用是根据form名称从对话机器人作用域或者配置domain文件中取出该form定义中的每一个需要收集信息的slot以及它所对应的mapping信息来进行处理:
下面来简单自定义一个iterator,在代码中实现了iter()和next()方法,iter()方法返回这个iterator对象,next()方法用于取得current的下一个值。当调用next()方法取值时,如果到达设定的边界,则抛出异常:
输出结果如下:
Lazy factory是基于generator和iterator的一个概念,即对于一个iterator来说,当你请求一个值之前,它是处于idle状态的,只有当请求值时这个iterator才会工作并通过next()方法返回值,之后又回归到idle状态。这样的懒加载机制对于处理大数据源来说是一个很好的工作方式。如果你不需要一次性加载所有数据到内存中时,你就可以使用generator或者iterator来按需获取数据。
二、关于Itertools及应用示例
Itertools是一个内置Python module,包括了各种用于创建高效循环的方法,提供了大量的工作于iterator的工具。通过下面的代码示例来看一下来自Itertools module的方法count()能够做些什么:
输出结果如下:
再来看一个示例:
输出结果如下,由于使用了cycle方法,实际效果就是对dessert的值进行循环:



