【发布时间】:2015-05-28 22:00:39
【问题描述】:
我有一个带有解析器的第 3 方库,它需要一个带有 new_token 方法的回调类。到目前为止,我的回调类和我的令牌处理如下所示:
class MySink(object):
def __init__(self):
self.tokens = []
def new_token(self, token):
self.tokens.append(token)
sink = MySink()
p = ThirdPartyParser(sink)
p.parse("my_data_file")
for t in sink.tokens:
print t
令牌列表可能会变得很长(导致内存问题),所以我想将 MySink 变成一个可迭代的类,其中令牌不必存储在列表中,而是在fly 并且在处理令牌时停止解析。像这样的:
class MyIterableSink(object): # incomplete!
def new_token(self, token):
# TODO:
# Store token for next iteration step
# halt execution like with 'yield', wait for next iteration step
sink = MyIterableSink()
p = ThirdPartyParser(sink)
p.parse("my_data_file")
for t in sink:
print t
如何修改MyIterableSink 类?这样的事情可能吗?我不能修改解析器类,只能修改回调类。我知道我必须实现__iter__ 和__next__ 方法并使用协程,其中令牌可能是使用send 方法发送的,但我不能完全理解它。任何代码示例都将不胜感激。
【问题讨论】:
-
@PadraicCunningham 不确定你的意思。对我来说,“容器”意味着所有令牌都存储在内部(就像现在的类一样)。我不想那样。相反,我希望一次只存储一个令牌。
-
我编辑了示例代码以使其更清晰。令牌通过
new_token回调推送到类中。 -
回调是异步的吗?
-
不,回调是同步的。
标签: python callback iterator coroutine