Python中与Ruby的延续相等的实现

7 投票
5 回答
2086 浏览
提问于 2025-04-11 18:05

下面这段Ruby代码在Python中怎么写呢?

def loop
  cont=nil
  for i in 1..4
    puts i
    callcc {|continuation| cont=continuation} if i==2
  end
  return cont
end

> c=loop
1
2
3
4
> c.call
3
4

参考链接:轻量级开发成功的秘密,第9部分:基于继续的框架

5 个回答

2

看看这个yield语句,它可以用来创建生成器。

我不太懂ruby,但看起来你在找这个:

def loop():
    for i in xrange(1,5):
        print i
        if i == 2:
            yield


for i in loop():
    print "pass"

补充一下:我意识到这其实是对真实的继续(continuations)的一种特殊化,但对于大多数情况来说,这应该足够了。使用yield来返回继续的状态,然后在生成器上使用.next()消息(通过调用loop()来获得生成器)来重新进入。

2

使用 generator_tools (安装方法:'$ easy_install generator_tools'):

from generator_tools import copy_generator

def _callg(generator, generator_copy=None):
    for _ in generator: # run to the end
        pass
    if generator_copy is not None:
        return lambda: _callg(copy_generator(generator_copy))

def loop(c):
    c.next() # advance to yield's expression
    return _callg(c, copy_generator(c))

if __name__ == '__main__':
    def loop_gen():
        i = 1
        while i <= 4:
            print i
            if i == 2:
                yield
            i += 1

    c = loop(loop_gen())
    print("c:", c)
    for _ in range(2):
        print("c():", c())

输出结果:

1
2
3
4
('c:', <function <lambda> at 0x00A9AC70>)
3
4
('c():', None)
3
4
('c():', None)
5

你引用的文章里有一个链接,指向了一个名为 “简单易懂的继续过程与示例” 的资源,这个链接讲的是在Python语言中如何使用继续过程。

撰写回答