2017-02-20 26 views
0

Я создал функцию Python:Если TypeError, вернуть Ложные

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-to-a-function) – khelwood

+0

Спасибо Хелвуд. – Jack

ответ

1

Вы воспринимаете ошибки типа в функции, но проблема заключается в вызове функции; это не может быть захвачено внутри самой функции.

Я не знаю, почему вы должны быть в состоянии вызвать функцию с неправильными аргументами, но один из способов поддержать это было бы принимать какие-либо аргументы с синтаксисом *args, а затем проверить, что у вас есть:

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

Спасибо Даниэлю - полезен. – Jack

0

Прежде всего, вы не можете предоставить функцию с большим количеством параметров, чем было объявлено. Это самая большая проблема.

Так что, если вы предоставляете функцию с 1 параметром и вы положили что-то вроде

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

Он будет работать, как ожидалось

+0

Я понимаю это. Я пытался обработать некоторые ошибки, если пользователь (ошибочно) ввел более одного аргумента. – Jack

+0

Если эта функция является бэкэндом интерфейса интерфейса пользователя, тогда вы должны обрабатывать ввод пользователя перед передачей значений функции (в функции типа 'handleUserInput'). Если вы разрабатываете API или что-то еще, что разработчик будет использовать, вы должны доверять разработчику не делать такую ​​простую ошибку. – ChickenFeet