函数对派生自bigop(init, report)
的大型动态内部数据结构进行操作,并接受可调用的. 函数返回当前状态的摘要。data
init
report(data)
status(data)
data
函数bigop
调用每个主要步骤report
的当前状态,data
依次调用status
. data
为每个步骤复制(或使其持久化)会很昂贵,因此report
必须在每个步骤完成才能bigop
继续。
函数view(gen)
接受生成gen
状态摘要的连续值的生成器,并在生成时显示每个值的可视化。该函数view
根据迄今为止生成的值维护内部状态。(在我的特殊情况下,可以复制这种内部状态,但最好避免。)
假设函数bigop
不能view
改变。
问题:如何定义gen
、report
和 一个程序main
,以便bigop
在 上运行,并在到达每个主要步骤init
时显示状态报告值的可视化? bigop
难点就在于此,report
并且gen
在其他函数内部被调用,所以通常的 Python 协程模式是不适用的。(在我的特殊情况下,bigop
实际上是一个生成器。)
之前关于使用回调从普通函数生成生成器的问题是使用线程回答的,但我想知道是否有更简单的方法。
注意:只有与 Python 2.7 兼容的答案对我有用;但如果差异是相关的,我很想看看 Python 3 的答案。
def bigop(init, report):
data = init
while data < 10: # complicated condition
print 'working ...'
data += 1 # complicated operation
report(data)
def view(gen):
for value in gen:
print value # complicated display routine
def main(init):
"""
example:
>> main(7)
'working ...'
8
'working ...'
9
'working ...'
10
"""
pass
问题:如何定义main
?