Python CTRL-C 退出而不回溯?

Jam*_*son 4 python exit traceback python-2.7

构建一个简单的 Python 游戏“石头、剪刀、布”以供学习之用。

\n\n

我在这里读过一些关于退出 Python 而不进行回溯的其他文章。我正在尝试实现它,但仍然得到回溯!一些 Python 专家可以指出这个 Python 假人出了什么问题吗?这个想法是,单击 RETURN(或输入“yes”或“y”将使程序再次运行 play(),但按 CTRL-C 将关闭它而不进行回溯。I\xc2\xb4m 使用 Python 2.7。

\n\n
    # modules\n    import sys, traceback\n    from random import choice\n\n    #set up our lists\n    ROCK, PAPER, SCISSORS = 1, 2, 3\n    names = \'ROCK\', \'PAPER\', \'SCISSORS\'\n\n    #Define a function for who beats who?\n    def beats(a, b):\n        return (a,b) in ((PAPER, ROCK), (SCISSORS, PAPER), (ROCK, SCISSORS))\n\n    def play():\n        print "Please select: "\n        print "1 Rock"\n        print "2 Paper"\n        print "3 Scissors"\n        # player choose Rock, Paper or Scissors\n        player_choice = int(input ("Choose from 1-3: "))\n        # assigns the CPU variable a random CHOICE from a list.\n        cpu_choice = choice((ROCK, PAPER, SCISSORS))\n\n        if cpu_choice != player_choice:\n            if beats(player_choice, cpu_choice):\n                print "You chose %r, and the CPU chose %r." % (names[player_choice - 1], names[cpu_choice - 1])\n                print "You win, yay!!"\n            else:\n                print "You chose %r, and the CPU chose %r." % (names[player_choice - 1], names[cpu_choice - 1])\n                print "You lose. Yuck!"\n        else:\n            print "You chose %r, and the CPU chose %r." % (names[player_choice - 1], names[cpu_choice - 1])\n            print "It\'s a tie!"\n\n        print "Do you want to play again? Click RETURN to play again, or CTRL-C to exit!"\n\n        next = raw_input("> ")\n\n        # THIS IS WHAT I\'M WORKING ON - NEED TO REMOVE TRACEBACK!\n        if next == "yes" or "y":\n            try:\n                play()\n            except KeyboardInterrupt:\n                print "Goodbye!"\n            except Exception:\n                traceback.print_exc(file=sys.stdout)\n            sys.exit(0)\n        elif next == None:\n            play()\n        else:\n            sys.exit(0)\n\n# initiate play() !\nplay()\n
Run Code Online (Sandbox Code Playgroud)\n

ron*_*man 5

尝试重构你的主循环;更多的内容是:

try:
    while (play()):
        pass
except KeyboardInterrupt:
    sys.exit(0)
Run Code Online (Sandbox Code Playgroud)

看起来play像:

def play():
    _do_play() # code for the actual game

    play_again = raw_input('play again? ')
    return play_again.strip().lower() in ("yes", "y")
Run Code Online (Sandbox Code Playgroud)