#Example 1: Breaking out from a deeply nested loop:
from goto importgoto, labelfor i in range(1, 10):for j in range(1, 20):for k in range(1, 30):printi, j, kif k == 3:
goto .end
label .endprint "Finished\n"
#Example 2: Restarting a loop:
from goto importgoto, label
label .startfor i in range(1, 4):printiif i == 2:try:
output=messageexceptNameError:print "Oops - forgot to define ‘message‘! Start again."message= "Hello world"goto .startprint output, "\n"
#Example 3: Cleaning up after something fails:
from goto importgoto, label#Imagine that these are real worker functions.
def setUp(): print "setUp"
def doFirstTask(): print 1; returnTruedef doSecondTask(): print 2; returnTruedef doThirdTask(): print 3; return False #This one pretends to fail.
def doFourthTask(): print 4; returnTruedef cleanUp(): print "cleanUp"
#This prints "setUp, 1, 2, 3, cleanUp" - no "4" because doThirdTask fails.
defbigFunction1():
setUp()if notdoFirstTask():
goto .cleanupif notdoSecondTask():
goto .cleanupif notdoThirdTask():
goto .cleanupif notdoFourthTask():
goto .cleanup
label .cleanup
cleanUp()
bigFunction1()print "bigFunction1 done\n"
#Example 4: Using comefrom to let the cleanup code take control itself.
from goto importcomefrom, labeldefbigFunction2():
setUp()if notdoFirstTask():
label .failedif notdoSecondTask():
label .failedif notdoThirdTask():
label .failedif notdoFourthTask():
label .failed
comefrom .failed
cleanUp()
bigFunction2()print "bigFunction2 done\n"
#Example 5: Using a computed goto:
from goto importgoto, label
label .getinput
i= raw_input("Enter either ‘a‘, ‘b‘ or ‘c‘, or any other letter to quit:")if i in (‘a‘, ‘b‘, ‘c‘):
goto*ielse:
goto .quit
label .aprint "You typed ‘a‘"goto .getinput
label .bprint "You typed ‘b‘"goto .getinput
label .cprint "You typed ‘c‘"goto .getinput
label .quitprint "Finished\n"
#Example 6: What happens when a label is missing:
from goto importgoto, label
label .real
goto .unreal#Raises a MissingLabelError exception.