Как я могу бросить TypeError с сообщением внутри оператора if в Python? - PullRequest
1 голос
/ 16 февраля 2020

Что я хочу сделать

Я хотел бы исправить свой текущий код для прохождения задачи кодирования, Codewars Предварительно заполнить массив .

Я надеюсь узнать, как бросить TypeError с сообщением с оператором if в этом случае.

Создать предварительное заполнение функции, которое возвращает массив из n элементов, которые имеют одинаковое значение v. Посмотрите, можете ли вы сделать это, не используя al oop.

Вы должны проверить ввод: v может быть любым (примитивным или иным образом), если v опущено, заполнить массив неопределенным, если n равно 0, вернуть пустой массив, если n является чем-то отличным от целого или целого числа. отформатированная строка (например, '123'), которая> = 0, выбрасывает TypeError

При выдаче TypeError сообщение должно быть n недействительным, где вы заменяете n на фактическое значение, переданное функции.

Code Examples
    prefill(3,1) --> [1,1,1]

    prefill(2,"abc") --> ['abc','abc']

    prefill("1", 1) --> [1]

    prefill(3, prefill(2,'2d'))
      --> [['2d','2d'],['2d','2d'],['2d','2d']]

    prefill("xyz", 1)
      --> throws TypeError with message "xyz is invalid"

Задача

Я прошел 4 выборочных теста среди 5 выборочных тестов, но не могу пройти следующий.

    prefill("xyz", 1)
      --> throws TypeError with message "xyz is invalid"

Сообщение об ошибке

Traceback (most recent call last): File "main.py", line 8,
in <module> prefill('xyz', 1) File "/home/codewarrior/solution.py", 
line 3, in prefill if int(n): ValueError: invalid literal for int() with base 10: 'xyz'

Текущий код

def prefill(n,v):

    if int(n):
        result = [0] * int(n)
        for i in range(len(result)):
            result[i] = v
        return result

    else:
        return TypeError, str(n) + "is invalid"

Среда разработки

Python 3.4.3

Ответы [ 2 ]

3 голосов
/ 16 февраля 2020

Используйте ключевое слово raise, чтобы вызвать исключение, а не вернуть его. raise используется для генерации нового исключения:

>>> raise TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError

В этом примере я поднял TypeError, напрямую используя класс исключения. Вы также можете создавать экземпляры ошибки следующим образом:

>>> t=TypeError()
>>> raise t
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError

Делая так, вы можете установить различные свойства объекта перед использованием raise. К опубликованной проблеме относится следующее требование:

При выдаче ошибки TypeEr сообщение должно быть n недействительным, где вы заменяете n на фактическое значение, переданное функции.

Это пример ситуации, когда необходимо создать экземпляр ошибки и задать для него свойство сообщения перед использованием raise. Это все еще можно сделать в одной строке:

>>> raise TypeError("foo")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo

Для перехвата исключений, используйте блок try-except вместо блока if:

x = 'hello, world!'
try:
    y = x / 2
except TypeError as e:
    e.args = (*e.args, str(x) + " is not valid")
    raise

Это вызовет ошибку:

TypeError: ("unsupported operand type(s) for /: 'str' and 'int'", 'hello, world! is not valid')

обратите внимание, что вы можете проверить тип данных переменной, используя type():

>>> x = 5
>>> type(x)
<class 'int'>
>>> if type(x) == int:
...   print("it's an int")
...
it's an int

Кроме того, пример кода может быть упрощенным до:

    return [v for _ in range(n)]

3 голосов
/ 16 февраля 2020

Вы можете использовать try - except, чтобы поймать ошибку, и выдать, например, еще одну:

def prefill(n,v):
    <b>try:</b>
        n = int(n)
    <b>except ValueError:</b>
        raise TypeError("{0} is invalid".format(n))
    else:
        return [v] * n

Например:

>>> prefill(3,1)
[1, 1, 1]
>>> prefill(2,"abc")
['abc', 'abc']
>>> prefill("1", 1)
[1]
>>> prefill(3, prefill(2,'2d'))
[['2d', '2d'], ['2d', '2d'], ['2d', '2d']]
>>> prefill("xyz", 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in prefill
ValueError: invalid literal for int() with base 10: 'xyz'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in prefill
TypeError: xyz is invalid

Вы не По сути, необходимо указать исключение для raise. Если вы хотите re - вызвать исключение, достаточно просто написать raise. Кроме того, вы можете указать кортеж исключений для перехвата и сделать необязательным v здесь, например:

def prefill(n,v=None):
    <b>try:</b>
        n = int(n)
    <b>except (TypeError, ValueError):</b>
        raise TypeError("{0} is invalid".format(n))
    else:
        return [v] * n
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...