【发布时间】:2010-12-03 19:45:04
【问题描述】:
我在 Python 中实现了一个基于生成器的扫描器,它将字符串标记为 (令牌类型,令牌值)形式的元组:
for token in scan("a(b)"):
print token
会打印
("literal", "a")
("l_paren", "(")
...
下一个任务意味着解析令牌流,为此,我需要能够在不向前移动指针的情况下从当前项向前查看一项。事实上,迭代器和生成器不会一次提供完整的项目序列,而是根据需要提供每个项目,这使得与列表相比,前瞻有点棘手,因为除非调用 __next__(),否则下一个项目是未知的。
基于生成器的前瞻的简单实现是什么样的?目前我正在使用一种解决方法,这意味着从生成器中列出一个列表:
token_list = [token for token in scan(string)]
然后,可以通过以下方式轻松实现前瞻:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
当然,这很好用。但是考虑到这一点,我的第二个问题出现了:首先让scan() 成为生成器真的有什么意义吗?
【问题讨论】:
-
er...这不仅仅是关于字符串的,是吗?想想
(_ for _ in (None, 'evil', 4, 0))之类的东西,那也是一个生成器..
标签: python generator lookahead