2008-11-23 6 views

Antwort

2

werfen Sie einen Blick auf die yield Anweisung Generatoren zu machen.

Ich spreche keine Rubin, aber es scheint, wie Sie für das gesuchte:

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


for i in loop(): 
    print "pass" 

Edit: Ich weiß, das ist im Grunde eine Spezialisierung der realen Fortsetzungen, aber es sollte für die meisten ausreichend sein, Zwecke. Verwenden Sie yield, um die Fortsetzung und die .next() Nachricht auf dem Generator zurückzugeben (zurückgegeben, indem Sie einfach loop() aufrufen) erneut eingeben.

+0

Es ist nicht so einfach, siehe http://stackoverflow.com/questions/312794/#313073 – jfs

0
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() 
2

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

Ausgang:

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

generator_tools ist ziemlich begrenzt, was es kopieren kann, finden Sie in der Dokumentation. Ich würde generator_tools nicht als Drop-in-Ersatz für callcc vorschlagen. – pts

2

Es gibt viele schwache Abhilfen welche Arbeit in besonderen Fällen (siehe andere Antworten auf diese Frage), aber es gibt kein Python-Sprachkonstrukt, das callcc entspricht oder das verwendet werden kann, um etwas zu erzeugen, das äquivalent zuist.

Möglicherweise möchten Sie Stackless Python oder die greenlet Python-Erweiterung, um zu versuchen, die beide Koroutinen liefern, auf deren Grundlage es möglich ist, One-Shot continutations zu bauen, aber das ist immer noch schwächer als Rubys callcc (die volle Fortsetzungen zur Verfügung stellt).

Verwandte Themen