2017-02-20 132 views
0

我已經創建了一個Python函數:如果類型錯誤,返回False

def is_cayley_table(table): 
    try: 
     if type(table) is not list: 
      return False 
     else: 
      n = len(table) 
      poss_values = range(0,n) 
      for i in range(0,n): 
       if len(table[i]) != n: 
        return False 
      for j in range(0,n): 
       if type(table[i][j]) is int and table[i][j] in poss_values: 
        return True 
       else: 
        return False 
    except TypeError: 
     return False 

我然後調用函數與無效參數:

is_cayley_table([1, 1, 0], [0, 1, 2], [1, 2, 2]) 

我希望函數返回 「假」,但目前我得到這個:

File "C:/Users/Jack/OneDrive/Documents/comp_project.py", line 27, in <module> 
    is_cayley_table([1, 1, 0], [0, 1, 2], [1, 2, 2]) 

TypeError: is_cayley_table() takes 1 positional argument but 3 were given 

如果任何人都可以幫助,我會非常感激。

傑克

+0

我知道它會工作。我試圖設置錯誤處理,以便如果用戶忘記括號,該函數返回false,而不是TypeError。 – Jack

+1

如果你想讓你的函數接受任意數量的參數,你可以使用'def is_cayley_table(* args)'來定義它。請參閱[可以傳遞給一個函數的可變數量的參數?](http://stackoverflow.com/questions/919680/can-a-variable-number-of-arguments-be-passed-toa-a-function) – khelwood

+0

謝謝Khelwood。 – Jack

回答

1

你捕獲類型錯誤的函數中,但問題是在調用功能;這不能在函數本身中捕獲。

我不知道爲什麼你需要能夠調用帶有無效參數的功能,但支持這一將接受任何參數與*args語法,然後檢查是否有什麼方法之一:

def is_cayley_table(*args): 
    if len(args) != 1: 
     return False 
    table = args[0] 
    ... 
+0

感謝丹尼爾 - v有幫助。 – Jack

0

首先,您不能提供比聲明的參數更多的參數。這是這裏最大的問題。

所以,如果你提供的功能與1點的參數,你把類似

is_cayley_table(([1, 1, 0], [0, 1, 2], [1, 2, 2])) 

預期

+0

我明白這一點。如果用戶(錯誤地)輸入了多個參數,我試圖做一些錯誤處理。 – Jack

+0

如果這個函數是某些前端UI的後端,那麼在將值傳遞給函數之前(在'handleUserInput'類型函數中),您應該處理用戶輸入。如果您正在開發API或開發人員將使用的其他東西,則應該相信開發人員不要犯這樣一個簡單的錯誤。 – ChickenFeet