Frage

Was ist das Python-Äquivalent des folgenden Code in Ruby?

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

Referenz: Secrets of leichten Entwicklung Erfolg, Teil 9: Fortsetzungen -basierte Frameworks

War es hilfreich?

Lösung

Der Artikel, den Sie zitiert enthält einen Link zum Fortsetzungen Made Simple und illustriert in Abschnitt Ressourcen, die über Fortsetzungen in der Sprache Python spricht.

Andere Tipps

einen Blick auf die Ausbeute Anweisung Generatoren zu machen.

Ich spreche keinen Rubin, aber es scheint, wie Sie für diesen suchen:

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


for i in loop():
    print "pass"

Edit: Ich weiß, das im Grunde eine Spezialisierung der realen Fortsetzungen ist, aber es sollte für die meisten Zwecke ausreichend sein. Verwenden Sie yield die Fortsetzung und die .next() Meldung auf dem Generator zurückzukehren (zurück nach nur anrufen loop()) erneut einzugeben.

Mit generator_tools (zu installieren: '$ 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())

Ausgabe:

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

Es gibt viele schwachen Abhilfen welcher Arbeit in besonderen Fällen (siehe andere Antworten auf diese Frage), aber es gibt keine Sprache Python-Konstrukt, das äquivalent zu callcc oder die dazu verwendet werden kann, etwas Gleichwertiges zu callcc zu bauen.

Sie können wollen Stackless Python oder die

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()
scroll top