Python Äquivalent von Fortsetzungen Ruby
-
10-07-2019 - |
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
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()