开发者社区> 问答> 正文

带有外部状态的生成器函数

你想定义一个生成器函数,但是它会调用某个你想暴露给用户使用的外部状态值

展开
收起
哦哦喔 2020-04-16 21:30:49 967 0
1 条回答
写回答
取消 提交回答
  • 如果你想让你的生成器暴露外部状态给用户, 别忘了你可以简单的将它实现为一个类,然后把生成器函数放到 __iter__() 方法中过去。比如:
    
    from collections import deque
    
    class linehistory:
        def __init__(self, lines, histlen=3):
            self.lines = lines
            self.history = deque(maxlen=histlen)
    
        def __iter__(self):
            for lineno, line in enumerate(self.lines, 1):
                self.history.append((lineno, line))
                yield line
    
        def clear(self):
            self.history.clear()
    为了使用这个类,你可以将它当做是一个普通的生成器函数。 然而,由于可以创建一个实例对象,于是你可以访问内部属性值, 比如 history 属性或者是 clear() 方法。代码示例如下:
    
    with open('somefile.txt') as f:
        lines = linehistory(f)
        for line in lines:
            if 'python' in line:
                for lineno, hline in lines.history:
                    print('{}:{}'.format(lineno, hline), end='')
    
    2020-04-16 21:31:03
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
fibjs 模块重构从回调到协程--陈垒 立即下载
用计算和数据去改变整个世界 立即下载
fibjs 模块重构从回调到协程 立即下载