2013-10-16 92 views
0

我不知道为什么我从来没有想过这个......但我想知道是否有一个整理/更短/更有效的错误处理用户输入的方式。例如,如果我要求用户输入“hello”或“goodbye”,并输入其他内容,我需要它告诉用户它是错的,然后再询问。Python用户输入错误处理

对于所有的编码是我做过的,这是多么我已经做到了(通常的问题是更好):

choice = raw_input("hello, goodbye, hey, or laters? ") 

while choice not in ("hello","goodbye","hey","laters"): 

    print "You typed something wrong!" 

    choice = raw_input("hello,goodbye,hey,or laters? ") 

是否有这样做的一个更聪明的方式?或者我应该坚持自己的方式?这是我用我写了一首歌。

感谢所有语言的方法,

肖恩

回答

4

做到这一点对于一个简单的脚本,你有它的方式是好的。

对于更复杂的系统,您可以有效地编写自己的解析器。

def get_choice(choices): 
    choice = "" 
    while choice not in choices: 
     choice = raw_input("Choose one of [%s]:" % ", ".join(choices)) 
    return choice 

choice = get_choice(["hello", "goodbye", "hey", "laters"]) 
+0

我喜欢这个,因为它是一般的,并且提示是基于选择自动生成的。我唯一的批评就是我会'',''加入(选择)'而不是''“.join(选择)'。而且我也会在选择时不选择:' – SethMMorton

+0

嗯。我可以看到创建一个更清洁的方法,但我觉得我更喜欢它的唯一方法是如果我将一个函数传递给它,以便我可以使用该方法来处理每个问题。这肯定是方便的,只是...它可能需要我花一点时间来找出并替换大声笑 – user2869231

+0

因为,我有很多的用户输入,所以我宁愿没有每个人的新方法 – user2869231

0

这是你怎么做。 根据你的使用方式,让列表中的选项可能更漂亮。

options = ["hello", "goodbye", "hey", "laters"] 
while choice not in options: 
    print "You typed something wrong!" 
+0

不要以为它是特别“漂亮”,但我想这是一个品味问题。不过,我喜欢你只构造一次列表/元组。 – Jblasco

+0

@Jblasco它在很大程度上取决于选项的数量。 – Mattias

+0

对不起,@Mattias,完全误读你的答案!我以为你打算说一个列表比一个元组更漂亮!然后,为了让事情变得更加复杂,我去了,并且说我确实喜欢你将这些选项分开...... xD – Jblasco

0

如果您修改代码以始终进入while循环,你只需要对一个行raw_input

while True: 
    choice = raw_input("hello, goodbye, hey, or laters? ") 
    if choice in ("hello","goodbye","hey","laters"): 
     break 
    else: 
     print "You typed something wrong!" 
+0

的确如此。如果代码中没有第二行代码 – user2869231

1

你可以用递归

>>> possible = ["hello","goodbye","hey"] 
>>> def ask(): 
...  choice = raw_input("hello,goodbye,hey,or laters? ") 
...  if not choice in possible: 
...   return ask() 
...  return choice 
... 
>>> ask() 
hello,goodbye,hey,or laters? d 
hello,goodbye,hey,or laters? d 
hello,goodbye,hey,or laters? d 
hello,goodbye,hey,or laters? hello 
'hello' 
>>> 
+0

,它可能会使事情变得更漂亮如果用户不知道如何输入正确的输入,是否会有达到最大递归限制的风险? – SethMMorton

+0

是的,这就是为什么通常你让用户知道。 –

+0

它似乎也会起反作用;使它更长,更复杂大声笑 – user2869231