2011-01-22 6 views
0

나는 다음 코드가 :다시 시작 예외 처리

def check1(n): 
    if len(n) != 4: 
     return raw_input("Enter 4 digits only") 
    else: 
     return True 

def check2(n): 
    if n.isdigit() != True: 
     return raw_input("Enter digits only") 
    else: 
     return True 

def check3(n): 
    if len(set(str(n))) != 4: 
     return raw_input("Enter non duplicate numbers only") 
    else: 
     return True 

sturn = 1 
lturn = 8  

a = raw_input("Enter the 4 numbers you want to play with: ") 

for turn in range(sturn, lturn): 
    b = raw_input("Enter your guess: ") 
    if (check1(b) != True or check2(b) != True or check3(b) != True): 
     if check1(b) != True: 
      print check1(b) 
     elif check2(b) != True: 
      print check2(b) 
     elif check3(b) != True: 
      print check3(b) 
    else: 
     print b 

내가 체크 기능 중 하나가 실패하는 경우, 그것은 다시 b = raw_input 줄에서 시작하여 재시험 모든 검사하는 것이이 같은를 다시 작성할 수있는 방법을 .

UPDATE 나는 keithjgrant과 m1k3y02에서 조언을 기울이는 후 코드를 개선했지만 제대로 작동하지 않습니다. 연속적으로 '1'을 입력하면 첫 번째 확인에 머 무르지 않고 다른 예외 사이에서 튀어 오릅니다.

def checks(n): 
    if len(n) != 4 or n.isdigit() != True or len(set(str(n))) != 4: 
     return False 
    else: 
     return True 

sturn = 1 
lturn = 8  

a = raw_input("Enter the 4 numbers you want to play with: ") 

for turn in range(sturn, lturn): 
    b = raw_input("Enter your guess: ") 
    while checks(b) != True: 
     if len(b) != 4: 
      b = raw_input("Enter 4 digits only") 
     if b.isdigit() != True: 
      b = raw_input("Enter digits only") 
     if len(set(str(b))) != 4: 
      b = raw_input("Enter non duplicate numbers only") 

    print b 

답변

3

귀하의 질문은 예외와는 아무런 관련이 없습니다. 다음과 같은 시도 다음과 같이

checks = [ 
    lambda n: (len(n)==4, "Enter 4 digits only."), 
    lambda n: (n.isdigit(), "Enter digits only."), 
    lambda n: (len(set(str(n)))==4, "Enter non duplicate numbers only.") 
] 

a = raw_input("Enter the 4 numbers you want to play with: ") 

sturn = 1 
lturn = 8 
for turn in range(sturn, lturn): 
    b = raw_input("Enter your guess: ") 
    all_good = True 

    for check in checks: 
     good,msg = check(b) 
     if not good: 
      print msg 
      all_good = False 
      break 

    if all_good: 
     print "{0} is correct!".format(b) 
     break 

당신은 예외를 사용하도록 재 작성 수 :

class CheckError(Exception): pass 

class WrongLengthError(CheckError): pass 
def check1(n): 
    if len(n) != 4: 
     raise WrongLengthError("Enter 4 digits only.") 

class NonDigitCharError(CheckError): pass 
def check2(n): 
    if not n.isdigit(): 
     raise NonDigitCharError("Enter digits only.") 

class HasDuplicatesError(CheckError): pass 
def check3(n): 
    if len(set(str(n))) != 4: 
     raise HasDuplicatesError("Enter non duplicate numbers only.") 


a = raw_input("Enter the 4 numbers you want to play with: ") 

sturn = 1 
lturn = 8 
for turn in range(sturn, lturn): 
    b = raw_input("Enter your guess: ") 

    try: 
     for check in (check1, check2, check3): 
      check(b) 

     print "{0} is correct!".format(b) 
     break 
    except CheckError, c: 
     print c 
+0

첫 번째 대답은이 부분이 의미하는 바를 이해하지 못합니다. msg = check (b)'? – super9

+0

두 번째 대답은 왜 예외에 대해 하나의 메인 클래스 대신 하위 클래스를 사용 했습니까? – super9

+0

@Nai - 나는 그렇게 할 필요가 없었고,이 간단한 예제에서는 아마도 과잉이라고 할 수 있습니다.보다 복잡한 시나리오에서는 하위 클래스를 사용하여 발생한 오류를 기반으로 다른 수정 작업을 수행 할 수 있습니다. –

1

모든 검사를 포함하는 래퍼 기능을 만들어야합니다. 한 번 실패하면 다시 함수를 호출하십시오

1

"처음부터 다시 시작 하시겠습니까?" raw_input으로 돌아가는 것을 의미합니까? 당신은 유효한 입력이있을 때까지 잠시 넣고 반복 할 수 있습니다.

또한 체크 기능을 하나로 결합하는 것이 좋습니다. 당신은 또한 당신이 정말로 필요하지 않을 때 각각 하나씩 두 번씩 부릅니다. 그냥 응답을 캡처하십시오.

valid_response = False 
while not valid_response: 
    input = raw_input("Enter your guess: ") 
    valid_response = checkInput(input) 
    if not valid_response: 
     print valid_response 
    else: 
     print input 

심지어 정리할 수 있지만 잘하면 방향을 알려줄 것입니다. 문자열이나 부울을 처리하기 위해 valid_response을 사용하여 칙칙한 느낌이 들었습니다. 체크 기능이 어떻게 작동하는지 재고함으로써 두 메소드를 구분할 수있는 방법을 찾을 수 있습니다.


당신은 몇 가지 문제를 가지고

업데이트 : 당신은 여전히 ​​여러 번 당신의 검사를 수행하고, 당신이 당신의 raw_input() 전화로 검증 로직을 결합하고 있습니다. 입력의 유효성 (부울 값)과 유효하지 않은 데이터의 이유 (추가 옵션)를 모두 확인하기 때문에 외부 함수를 사용하지 않는 것이 더 합리적입니다. 특히 몇 줄의 코드에 대해서만 이야기하고 있기 때문에 특히 그렇습니다. 이 시도 : 난 당신이 그들과 함께가는하는지 아주 잘 모르겠습니다 이후 난 정말이 코드에서 평가하지 않은

sturn = 1 
lturn = 8  

# you never do anything with this variable "a". Did you mean to type "b" here? 
a = raw_input("Enter the 4 numbers you want to play with: ") 

for turn in xrange(sturn, lturn): 
    valid_input = False 
    b = raw_input("Enter your guess: ") 
    while not valid_input: 
     if len(b) != 4: 
      b = raw_input("Enter 4 digits only") 
     elif b.isdigit() != True: 
      b = raw_input("Enter digits only") 
     elif len(set(str(b))) != 4: 
      b = raw_input("Enter non duplicate numbers only") 
     else: 
      valid_input = True     # breaks you out of your while loop 
      print b 

한 것은, 세 검사 작동 여부입니다. 아직 테스트하지 않았다면, 각각의 테스트를 개별적으로 테스트하여 실제로 사용자 입력의 유효성을 실제로 확인하는 것이 좋습니다.

+0

을 지금은이 업데이트했는지 ... @의 휴 - 보스 웰의 대답과 함께 할 것입니다. 아마 예외를 사용합니다. 이것은 아마도 갈 길입니다. 더 많은 pythonic 코드는 말할 것도 없습니다. :) – keithjgrant