在Python脚本中重试用户输入

war*_*hip 3 python

我试图弄清楚,如果我在Python脚本中提交一个简单的错误,是否有办法"强迫"Python脚本不"反击"到bash环境中.

这是一个MWE(MWE.py)来说明这一点:

如果我在下面的MWE中按3,你怎么能告诉Python不要让我退出程序?

x = raw_input("Please input a number 1 or 2: ")
if (x == '1'):
    print '1'
elif (x == '2'):
    print '2'
#else:
    #print 'Neither 1 nor 2.'
Run Code Online (Sandbox Code Playgroud)

请注意,我的最后两行已注释掉.如果我取消注释它们,显然我会得到相应的print语句,程序将成功完成.但是,让我们假设我没有最后两行,并希望MWE.py"保持在Python模式"(可以这么说)而不是严厉地让我回到bash shell,从而迫使我从头开始重新运行python MWE.py.

有办法以某种方式实现这一目标吗?

显然,这是一个微不足道的MWE,但我试图理解这个原则:是否有可能在我提交输入错误之前返回我所呈现的最后一个提示(例如当我按下3时在此MWE中提交) .是否基本上有一种"通用的方式"可以回到x = raw_input("Please input a number 1 or 2: ")(或者在我输入错误之前给出的最新提示)?

这在需要在不同阶段进行多个用户输入的程序中显得特别重要.我不想从头开始.

cda*_*rke 6

它被称为循环(不需要围绕条件的括号):

x = None

while x != '1' and x != '2':
    x = raw_input("Please input a number 1 or 2: ")
    if x == '1':
        print '1'
    elif x == '2':
        print '2'
    else:
        print 'Neither 1 nor 2.'

print "all OK"
Run Code Online (Sandbox Code Playgroud)

写这个有很多种方法.你应该注意x在循环之前初始化的方式,None这在python中是典型的.

另请注意,值x是字符串,而不是int.

如果您有大量可能的值要测试,这很快就会变得难以处理.所以另一种方法是使用无限循环break输出正确的答案:

x = None

while True:
    x = raw_input("Please input a number 1 or 2: ")
    if x == '1':
        print '1'
        break
    elif x == '2':
        print '2'
        break
    else:
        print 'Invalid input, try again'

print "all OK"
Run Code Online (Sandbox Code Playgroud)

  • 弄清楚OP正在描述一个循环是非常令人印象深刻的. (2认同)
  • @warship:我不得不承认,当我看到标题时,我正在考虑`exec python myscript.py`以防止返回bash.但是对于一个解释得很好的问题给你满分 - 从"为什么我的程序不能正常工作"做了很好的改变. (2认同)