【发布时间】: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() 函数“重新启动”迭代......回调没有任何内容我也可以提供“返回”数据......接下来将迫使我“重新连接”到日志流,这意味着我丢失了数据。此外,由于数据源实际上是无限的,因此生成器是一种更好的方法。