Перейдите к следующему слайду, нажав кнопку Вправо
Ищем и исправляем ошибки в коде 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 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 прочитал код до этого места и неожиданно обнаружил конец строки, хотя ожидал увидеть двойную кавычку " — символ, закрывающий строку (строчный литерал).
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, но в интернете осталось много устаревших статей. Скорее всего вы ещё не раз столкнётесь с таким принтом в будущем.
Терминал даже подсказал правильный вариант, настолько часто встречается ошибка.
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 говорит, что не знает, что такое Привет.
Python чувствителен к отступам. Если отступы не оправданы, он будет ругаться ошибкой IndentationError.
Отступы в Python — часть языка. Вы подробнее узнаете об этом, когда столкнётесь с циклами и условиями.
print("Привет!")
print("Пока!")
File "main.py", line 1
print("Привет!")
^
IndentationError: unexpected indent
Лишние отступы
IndentationError: unexpected indent
Ошибка отступа: неожиданный отступ
Если вы пользуетесь сторонними функциями, их нужно сперва импортировать. 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
Теперь функция импортирована и ошибки больше не будет.
from time import sleep
sleep(1)
Traceback (most recent call last):
File "main.py", line 1, in <module>
NameError: name 'sleep' is not defined
Дробные числа в 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)
Ошибка Типа: слип принимает только один аргумент, а переданы два.
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.
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.
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