2014-02-08 8 views
0

먼저 "y" "Y" "n"또는 "N"만 유효한 응답으로 허용되도록 입력 유효성 검사를 사용할지 묻습니다. 내 코드를 실행할 때 충돌하는 것 같습니다.Python : 입력 유효성 검사

choice = raw_input("Would you like to go first or not? (y/Y or n/N): ") 
print "" 

try: 
    valid_choice = False 
    while not valid_choice: 
     if choice == "y" or choice == "Y": 
      users_turn = True 
      valid_choice = True 
     elif choice == "n" or choice == "N": 
      users_turn = False 
      valid_choice = True 
      break 
    else: 
      print "Invalid Choice." 

except NameError: 
    print "You can only enter y/Y or n/N" 
+0

* "내 코드가 이상하게 보입니다"* - 더 정확하게는? 오류가 무엇입니까? – Dolda2000

+0

if 절에 'break'가 누락되었습니다 – zhangxaochen

+0

이러한 대답 중 하나라도 도움이 되었으면 해결 방법 중 하나를 선택해야합니다. –

답변

2

아톰에서 코드의 흐름이 너무 많아서 가능한 경로가 너무 많습니다. 모두 (

question = "Would you like to go first or not? (y/Y or n/N): " 
choice = raw_input(question) 
while choice not in ['y', 'Y', 'n', 'N']: 
    print 'Invalid choice' 
    choice = raw_input(question) 
users_turn = choice in ['y', 'Y'] 

나는 그것이 문자 y 또는 응답 등 n을 허용 함을 나타 내기 위해 (Y/n)를 사용하는 콘솔 응용 프로그램에 대한 일반적인 패턴이라고 말할해야했다 가졌 : 당신은 같은 뭔가를 단순화 할 수 대문자는 기본 옵션을 나타냅니다. int로서 그냥

choice = raw_input('Would you like to go first? (Y/n)') 
users_turn = choice.lower() not in ['n', 'no'] 
+0

@ zhangxaochen 문자열을 사용하는 편집을 보았지만 목록을 사용하는 것을 선호합니다. 다른 언어를 지원하기 위해 '예', '아니요'및 이니셜을 좋아하는 다른 가능한 답변을 추가 할 수 있습니다. – elias

+0

예 그리고 'yYnN'의''Yn '이'True'를하기 때문에 편집을 취소했습니다. 미안; P – zhangxaochen

+0

@ zhangxaochen 오, 그래, 저기도있어! =) – elias

0

: 당신이 결정 당신이 질문에 입력을 요청 처음으로 확인하기 위해 사용자를 신뢰할 수있는 경우

그래서, 당신은이 같은 기본 응답 코드를 설정할 수 있습니다 엘리아스 '대답 대신, 나는 다음과 같은 선물하고 싶습니다 : (

while True: 
    choice = raw_input("Would you like to go first or not? (y/Y or n/N): ") 
    if choice in ["y", "Y", "n", "N"]: 
     break 
    print "Invalid choice" 
users_turn = choice in ["y", "Y"] 

그것은 그에서 더 나은 그것을 물어 줄을 복제하지 않지만 점에서 악화 while True/break 구문은 조금 못생긴 그 파이썬이 do 인 경우 좋을 것입니다. ... while C와 유사하지만, 아아). 가장 좋아하는 것을 직접 선택하십시오. :)

또한, 단지 자신의 코드에 당신이 가지고있는 몇 가지 몇 가지 오류를 지적하기 :

  • try ... 코드에서 아무것도 NameError을 넣지 때문에 except NameError 블록이 완전히 중복, 특히 실제 사용자 오류를 알리는 것은 아닙니다.
  • 잘못된 들여 쓰기 부분에 else 줄이 있습니다. 약자로 if/elif 블록이 아닌 while 블록과 일치하므로 의도하지 않은 동작이 발생할 수 있습니다.
  • elif 블록의 break은 중복입니다. valid_choiceTrue으로 설정하면 while 루프가 어쨌든 종료됩니다.
  • 가장 중요한 것은입니다. 사용자가 잘못된 대답을 입력 할 때 다시 처리하지 않아 코드가 완전히 반복됩니다. 아마도 이것은 당신이 말하는 불특정 충돌 일 것입니다.
0
def get_one_of(prompt, options, default=None): 
    options = set(options) 
    while True: 
     val = raw_input(prompt) 
     if val == '' and default is not None: 
      return default 
     elif val in options: 
      return val 

response = get_one_of('Do you want to go first? [Yn] ', 'yYnN', 'y') 
users_turn = response in 'yY'