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部分:延续基于框架

有帮助吗?

解决方案

您引用的文章包含指向 Continuations Made Simple and Illustrated的链接参考资料部分,讨论Python语言中的延续。

其他提示

查看产量制作发电机的声明。

我不会说任何红宝石,但看起来你正在寻找这个:

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


for i in loop():
    print "pass"

编辑:我意识到这基本上是真实延续的特化,但它应该足以满足大多数目的。使用yield返回生成器上的延续和.next()消息(仅通过调用loop()返回)重新输入。

Using generator_tools (to install: '$ 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())

Output:

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

There are many weak workarounds which work in special cases (see other answers to this question), but there is no Python language construct which is equivalent to callcc or which can be used to build something equivalent to callcc.

You may want to try Stackless Python or the greenlet Python extension, both of which provide coroutines, based on which it is possible to build one-shot continutations, but that's still weaker than Ruby's callcc (which provides full continuations).

def loop():    
    def f(i, cont=[None]):        
        for i in range(i, 5):
            print i
            if i == 2:
                cont[0] = lambda i=i+1: f(i)
        return cont[0]
    return f(1)

if __name__ == '__main__':
    c = loop()
    c()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top