【问题标题】:Learning Iterators (Dive into Python3)学习迭代器(深入 Python3)
【发布时间】:2019-02-05 10:56:46
【问题描述】:

一个问题基于this snippet作者对此的cmets如下:

只要从模式文件中读取的规则与我们尝试复数的单词不匹配,这个读取-构建和缓存过程就会继续。如果我们确实在文件末尾找到了匹配规则,我们只需使用它并停止,文件仍处于打开状态。文件指针将停留在我们停止读取的地方,等待下一个 readline() 命令。与此同时,缓存中现在有更多的项目,如果我们重新开始尝试复数一个新单词,缓存中的每个项目将在读取下一行之前尝试模式文件。

  1. 在上面引用的文本中,我没有看到任何以粗体显示的实现。每个缓存项究竟是如何尝试的?
  2. 在每次对象调用时清除 self.cache 是否正确?

【问题讨论】:

    标签: python iterator


    【解决方案1】:
    1. plural 函数中:
    for matches_rule, apply_rule in rules:
        if matches_rule(noun):
    
    1. LazyRules 类的每个新实例(例如rules = LazyRules())都以自己的空缓存开始(__init__ 下的self.cache = [])。每次您在该对象 (for ... in rules) 首次使用该缓存后对其进行迭代。

    【讨论】: