http://entrian.com/goto/
# Example 1: Breaking out from a deeply nested loop: from goto import goto, label for i in range(1, 10): for j in range(1, 20): for k in range(1, 30): print i, j, k if k == 3: goto .end label .end print "Finished\n" # Example 2: Restarting a loop: from goto import goto, label label .start for i in range(1, 4): print i if i == 2: try: output = message except NameError: print "Oops - forgot to define ‘message‘! Start again." message = "Hello world" goto .start print output, "\n" # Example 3: Cleaning up after something fails: from goto import goto, label # Imagine that these are real worker functions. def setUp(): print "setUp" def doFirstTask(): print 1; return True def doSecondTask(): print 2; return True def doThirdTask(): print 3; return False # This one pretends to fail. def doFourthTask(): print 4; return True def cleanUp(): print "cleanUp" # This prints "setUp, 1, 2, 3, cleanUp" - no "4" because doThirdTask fails. def bigFunction1(): setUp() if not doFirstTask(): goto .cleanup if not doSecondTask(): goto .cleanup if not doThirdTask(): goto .cleanup if not doFourthTask(): goto .cleanup label .cleanup cleanUp() bigFunction1() print "bigFunction1 done\n" # Example 4: Using comefrom to let the cleanup code take control itself. from goto import comefrom, label def bigFunction2(): setUp() if not doFirstTask(): label .failed if not doSecondTask(): label .failed if not doThirdTask(): label .failed if not doFourthTask(): label .failed comefrom .failed cleanUp() bigFunction2() print "bigFunction2 done\n" # Example 5: Using a computed goto: from goto import goto, 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 *i else: goto .quit label .a print "You typed ‘a‘" goto .getinput label .b print "You typed ‘b‘" goto .getinput label .c print "You typed ‘c‘" goto .getinput label .quit print "Finished\n" # Example 6: What happens when a label is missing: from goto import goto, label label .real goto .unreal # Raises a MissingLabelError exception.
时间: 2024-11-15 00:36:55