【发布时间】:2013-05-31 10:50:12
【问题描述】:
函数bigop(init, report) 对派生自init 的大型动态内部数据结构data 进行操作,并接受可调用的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 实际上是一个生成器。)
A previous question关于使用回调从普通函数生成生成器的问题是使用线程回答的,但我想知道是否有更简单的方法。
注意:只有与 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如何定义?
【问题讨论】:
-
很难从这些描述中理解你的设计。你能写一个SSCCE,用简单的例子来说明你在做什么,这样你就可以指着它说,“每次这条线运行时,我希望这里的代码能做到这一点”?
标签: python concurrency generator coroutine