【问题标题】:In python, how do I make a class a generator? [duplicate]在 python 中,如何使类成为生成器? [复制]
【发布时间】:2015-10-28 09:32:19
【问题描述】:

我正在使用 varnish 4 中的 varnish API。它产生日志条目的方式是通过 Dispatch'ing 来处理它,并传入一个回调。简单版:

class vlog(object):
    def __init__(self):
        self.body = []
    def callback(self, vap, cbd, priv):
        self.body.append(cbd)
    def main(self):
        self.vlog = varnishapi.VarnishLog(sopath="libvarnishapi.so")
        while True:
            ret = self.vlog.Dispatch(self.callback)
            if ret == 0:
                time.sleep(0.1)

我需要在 self.callback 中做更多的事情来正确聚合数据,但无论如何。

我真正的问题是:我怎样才能把上面的类变成一个生成器?我的理想用法是这样的:

    vlog_inst = vlog()
    for log_aggregate in vlog_inst:
        pass

只需在回调函数中添加“yield”语句就不会触发迭代。 (令我惊讶的是,添加 yield 语句也会导致我所有的 print 语句也不产生任何输出......我显然遗漏了一些东西。)

【问题讨论】:

  • 定义__iter__next(Python 3 中的__next__)。必须有一个副本。
  • 由于这是一个利用回调的数据源,我无法使用 next() 函数“重新启动”迭代......回调没有任何内容我也可以提供“返回”数据......接下来将迫使我“重新连接”到日志流,这意味着我丢失了数据。此外,由于数据源实际上是无限的,因此生成器是一种更好的方法。

标签: python generator


【解决方案1】:

你希望你的类是可迭代的。生成器是一种实现可迭代对象的方法,但这并不是使类可迭代的必要条件。

你可以实现一个__iter__ 方法;如果你把它变成一个生成器函数,你就不需要其他任何东西了:

def __iter__(self):
    while True:
        yield self.vlog.Dispatch(self.callback)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2016-01-08
    • 2018-12-18
    • 2016-07-08
    • 2010-11-15
    • 2019-09-07
    • 2011-04-17
    相关资源
    最近更新 更多