Python CTRL-C退出而不进行回溯?

Python CTRL-C退出而不进行回溯?,python,python-2.7,exit,traceback,Python,Python 2.7,Exit,Traceback,构建一个简单的Python游戏“石头、布、剪刀”,供学习之用 我在这里读了一些关于在没有回溯的情况下退出Python的其他帖子。我正在尝试实现它,但仍然得到回溯!一些Python高手能指出这个Python虚拟对象的错误吗?这个想法是,单击RETURN(或键入“yes”或“y”)将使程序再次运行play(),但单击CTRL-C将关闭它而不进行回溯。我使用的是Python 2.7 # modules import sys, traceback from random impo

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

我在这里读了一些关于在没有回溯的情况下退出Python的其他帖子。我正在尝试实现它,但仍然得到回溯!一些Python高手能指出这个Python虚拟对象的错误吗?这个想法是,单击RETURN(或键入“yes”或“y”)将使程序再次运行play(),但单击CTRL-C将关闭它而不进行回溯。我使用的是Python 2.7

    # modules
    import sys, traceback
    from random import choice

    #set up our lists
    ROCK, PAPER, SCISSORS = 1, 2, 3
    names = 'ROCK', 'PAPER', 'SCISSORS'

    #Define a function for who beats who?
    def beats(a, b):
        return (a,b) in ((PAPER, ROCK), (SCISSORS, PAPER), (ROCK, SCISSORS))

    def play():
        print "Please select: "
        print "1 Rock"
        print "2 Paper"
        print "3 Scissors"
        # player choose Rock, Paper or Scissors
        player_choice = int(input ("Choose from 1-3: "))
        # assigns the CPU variable a random CHOICE from a list.
        cpu_choice = choice((ROCK, PAPER, SCISSORS))

        if cpu_choice != player_choice:
            if beats(player_choice, cpu_choice):
                print "You chose %r, and the CPU chose %r." % (names[player_choice - 1], names[cpu_choice - 1])
                print "You win, yay!!"
            else:
                print "You chose %r, and the CPU chose %r." % (names[player_choice - 1], names[cpu_choice - 1])
                print "You lose. Yuck!"
        else:
            print "You chose %r, and the CPU chose %r." % (names[player_choice - 1], names[cpu_choice - 1])
            print "It's a tie!"

        print "Do you want to play again? Click RETURN to play again, or CTRL-C to exit!"

        next = raw_input("> ")

        # THIS IS WHAT I'M WORKING ON - NEED TO REMOVE TRACEBACK!
        if next == "yes" or "y":
            try:
                play()
            except KeyboardInterrupt:
                print "Goodbye!"
            except Exception:
                traceback.print_exc(file=sys.stdout)
            sys.exit(0)
        elif next == None:
            play()
        else:
            sys.exit(0)

# initiate play() !
play()

一个问题是,您需要将
原始输入
语句包含在
try
子句中,除了键盘中断
子句以及实际的
播放
函数

try:
   nxt = raw_input('>')
   if nxt.lower().startswith('y') or (nxt.strip() == ''):
      play()
   else:
      sys.exit(0)
except KeyboardInterrupt:
   sys.exit(0)
except Exception:
   traceback.print_exc(file=sys.stdout)
您调用了两次
play()
,因此需要将这两种情况都放在
try
/
块中,但
块除外:

if next in ("yes", "y"):
    try:
        play()
    except KeyboardInterrupt:
        print "Goodbye!"
    except Exception:
        traceback.print_exc(file=sys.stdout)
    sys.exit(0)
elif next is None:
    try:
        play()
    except KeyboardInterrupt:
        print "Goodbye!"
    except Exception:
        traceback.print_exc(file=sys.stdout)
        sys.exit(0)
else:
    sys.exit(0)
我已经纠正了另外两个问题,最好使用python中的
is
测试
None
,如果
测试不起作用,您的第一个
,因为
next==“yes”或“y”
被解释为
next==“yes”
“y”
分别使用
之间的
“y”
始终被视为
True
,因此您永远不会访问代码中的其他分支


请注意,我怀疑上面的代码可以简化得多,但您根本没有向我们展示您的
play()
函数,因此您让我们猜测您正在尝试执行的操作。

尝试重新构造主循环;更多内容如下:

try:
    while (play()):
        pass
except KeyboardInterrupt:
    sys.exit(0)
play
看起来像:

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

    play_again = raw_input('play again? ')
    return play_again.strip().lower() in ("yes", "y")

你能告诉我们你的回溯吗?我第一次在这里看到的这种没有回溯的退出代码:,但不同的是,现在我试图在if-elif-else语句中使用它…你能将输出粘贴到这里吗?我无法复制。而且,你的代码不会像你的问题中复制的那样运行。你需要定义
play()
下一步
同样,
退出(0)
可能应该通过
sys.exit(0)
来完成。小心你的if语句。
a='n';bool(a='yes'或'y')
返回
True
三个答案,一个一个!@KarlKnechtel:是的,改写了一点。有什么真正好的理由不把
None
放进
('y','yes'))
tuple并避免重复的代码?我意识到这将再次让我们回到测试
nxt==None
而不是
nxt是None
,但我认为在这里保存重复的代码是值得的(因为
nxt
不太可能是带有自定义
\uuuuuuu eq\uuuu
的对象)@Martijn Pieters:能在众多真正的专家中学习Python,我感到很幸运。还感谢您指出next中的“y=”yes“或“y”多余-这对我来说是一个新手错误。而且,我想,当我们讨论提示/代码建议的话题时,我们可能会建议OP下一步也不要隐藏内置的
。。@MartijnPieters-我仍然很难解析这个回溯。(那些换行符有多大帮助,真令人惊讶)…但最终,我们能否同意某些
raw\u input
不包含在他的try/except中?
raw\u input
在他的
play()
函数中(“第44行,in play”在
raw\u input
部分之前)。但是是的,
raw_input
抛出异常,但它没有被捕获。@MartijnPieters:是的,我更新了问题中的代码以反映整个程序。我只是在第一个小时左右才看到这个,所以它非常粗糙。谢谢你的宝贵建议和见解。