2011-01-22 51 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 =檢查(b)`? – super9 2011-01-22 23:01:48

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 2011-01-22 03:18:59