Отладка кода для новичков

Перейдите к следующему слайду, нажав кнопку Вправо

Ищем и исправляем ошибки в коде Python

Подготовлено онлайн-курсом

https://dvmn.org

Не паникуйте

Не бойтесь. Искусство написания кода не в том, чтобы не допускать ошибки, а в том, чтобы уметь их исправлять.

print("Привет!)
Traceback (most recent call last):
  File "main.py", line 1
    print("Привет!)
                   ^
SyntaxError: EOL while scanning string
literal

Ошибки выглядят страшно, пока вы не привыкли к ним.

Не смотрите в код, смотрите на ошибку

Ошибки содержат в себе много информации. Даже слишком много, поэтому и выглядят пугающе.

 

Смотрите на последние строки, там написан тип ошибки и строка, на которой она возникла.

print("Привет!)
Traceback (most recent call last):
  File "main.py", line 1
    print("Привет!)
                   ^
SyntaxError: EOL while scanning string
literal

Название ошибки

Номер той строки кода, где прячется ошибка

В ошибке сказано что пошло не так

print("Привет!)
Traceback (most recent call last):
  File "main.py", line 1
    print("Привет!)
                   ^
SyntaxError: EOL while scanning string
literal

Что именно не понравилось Python. Перевод на русский:

 

Синтаксическая Ошибка: встретил символ конца строки при считывании строкового литерала. Здесь пригодится Яндекс Переводчик.

Python сам подсказывает где искать

Если присмотреться, то видно, что не хватает двойной кавычки перед скобкой ). Python прочитал код до этого места и неожиданно обнаружил конец строки, хотя ожидал увидеть двойную кавычку " — символ, закрывающий строку (строчный литерал).

print("Привет!)
Traceback (most recent call last):
  File "main.py", line 1
    print("Привет!)
                   ^
SyntaxError: EOL while scanning string
literal

Стрелочка. Ошибку искать здесь, сразу после символа скобки )

Другая ошибка

print("Привет!"
Traceback (most recent call last):
  File "main.py", line 2

                         ^
SyntaxError: unexpected EOF while parsing

Другая ошибка. Python говорит, что не ожидал здесь встретить символ конца файла. Осталась незакрытой скобка — нужно дописать в конце символ )

Если совсем забыть скобки

print "Привет!"
Traceback (most recent call last):
  File "main.py", line 1
    print "Привет!"
              ^
SyntaxError: Missing parentheses in call to
'print'. Did you mean print("Привет!")?

В Python2 вывод был без скобок. Сейчас он устарел все пишут на Python3, но в интернете осталось много устаревших статей. Скорее всего вы ещё не раз столкнётесь с таким принтом в будущем.

Терминал даже подсказал правильный вариант, настолько часто встречается ошибка.

SyntaxError, сложный случай

students = [
    ['Егор', 'Кузьмин'],
    ['Денис', 'Давыдов'],
]

for first_name, last_name in students:
    label = 'Имя ученика: {first_name} {last_name}'.format(
        first_name = first_name
        last_name = last_name
    )

    print(label)
Traceback (most recent call last):
  File "script.py", line 9
    last_name = last_name
            ^
SyntaxError: invalid syntax

Если код выглядит запутано и ошибка в глаза не бросается, то используйте стандартные приемы, описанные в статье про SyntaxError.

Опечатка

Дело было в опечатке. Не prnt, а print.

prnt("Привет!")
Traceback (most recent call last):
  File "main.py", line 1, in <module>
NameError: name 'prnt' is not defined

Ошибка Имени: имя 'prnt' не задано.

 

Python говорит, что не знает, что такое prnt.

Опечатка

Print("Привет!")

PRINT("Привет!")
Traceback (most recent call last):
  File "main.py", line 1, in <module>
NameError: name 'Print' is not defined

Python чувствителен к регистрам. Нужно писать print маленькими буквами.

Ошибка Имени: имя 'Print' не задано.

 

Python говорит, что не знает, что такое Print.

Кавычки

print(Привет)
Traceback (most recent call last):
  File "main.py", line 1, in <module>
NameError: name 'Привет' is not defined

Строки в Python определяются кавычками, если кавычек нет — это не строка, а команда. А команды "Привет" Python не знает.

Ошибка Имени: имя 'Привет' не задано.

 

Python говорит, что не знает, что такое Привет.

IndentationError

Python чувствителен к отступам. Если отступы не оправданы, он будет ругаться ошибкой IndentationError.

 

Отступы в Python — часть языка. Вы подробнее узнаете об этом, когда столкнётесь с циклами и условиями.

print("Привет!")
   print("Пока!")
  File "main.py", line 1
    print("Привет!")
    ^
IndentationError: unexpected indent

Лишние отступы

IndentationError: unexpected indent

 

Ошибка отступа: неожиданный отступ

NameError

Если вы пользуетесь сторонними функциями, их нужно сперва импортировать. Python не знает откуда взялось sleep.

sleep(1)
Traceback (most recent call last):
  File "main.py", line 1, in <module>
NameError: name 'sleep' is not defined

NameError: name 'sleep' is not defined

 

Ошибка Имени: неизвестное название sleep

NameError

Теперь функция импортирована и ошибки больше не будет.

from time import sleep

sleep(1)
Traceback (most recent call last):
  File "main.py", line 1, in <module>
NameError: name 'sleep' is not defined

TypeError

Дробные числа в Python пишутся через точку: 0.5

 

Запятую Python воспринимает так, будто вы передали ему два числа через запятую.

from time import sleep

sleep(0,5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sleep() takes exactly one
argument (2 given)

TypeError: sleep() takes exactly one
argument (2 given)

 

Ошибка Типа: слип принимает только один аргумент, а переданы два.

LanguageCodeError

from transliterate import translit


print(translit("Lorem ipsum"), 'hy')
Traceback (most recent call last):
  File "main.py", line 10, in <module>
    print(translit("Lorem ipsum"), 'hy')
  File "/home/runner/.site-packages/transliterate/utils.py", line 79, in translit
    _("``language_code`` is optional with ``reversed`` set to True "
transliterate.exceptions.LanguageCodeError: ``language_code``
is optional with ``reversed`` set to True only.

``language_code`` is optional with ``reversed`` set to True only.

 

Аргумент language_code опционален только если задано reversed=True.

LanguageCodeError

from transliterate import translit


print(translit("Lorem ipsum"), 'hy')
Traceback (most recent call last):
  File "main.py", line 10, in <module>
    print(translit("Lorem ipsum"), 'hy')
  File "/home/runner/.site-packages/transliterate/utils.py", line 79, in translit
    _("``language_code`` is optional with ``reversed`` set to True "
transliterate.exceptions.LanguageCodeError: ``language_code``
is optional with ``reversed`` set to True only.

Похоже, питон не нашёл аргумент language_code.

LanguageCodeError

from transliterate import translit


print(translit("Lorem ipsum"), 'hy')
Traceback (most recent call last):
  File "main.py", line 10, in <module>
    print(translit("Lorem ipsum"), 'hy')
  File "/home/runner/.site-packages/transliterate/utils.py", line 79, in translit
    _("``language_code`` is optional with ``reversed`` set to True "
transliterate.exceptions.LanguageCodeError: ``language_code``
is optional with ``reversed`` set to True only.

Но вот же он.

А если присмотреться внимательнее?

Он передан в print, а не в translit.

Создано для онлайн-курса https://dvmn.org