August 22

Семантические ошибки в Python на этапе выполнения

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

Ошибка 1. Имя переменной не определено к моменту использования.

Если мы пытаемся использовать какую-то переменную в вычислениях, но еще не присваивали ей значение, то возникает данная ошибка. Например, в программе

a = int(input())
print(b + 1)

мы вначале введем значение переменной a, и только потом при выполнении второй строки будет выведено «NameError: name 'b' is not defined». Таким образом, данная проблема будет диагностирована слишком поздно – уже когда программа выполнялась достаточно долго. При этом программа будет прервана на этом месте и все данные будут потеряны.

Сравним это поведение с аналогичной программой на PascalABC.NET:

begin
  var a := ReadInteger;
  Print(b);
end.

При запуске такой программы мы получаем ошибку компиляции

Вывод. Компилятор PascalABC.NET контролирует все семантические ошибки и не даст запустить программу, которая содержит хотя бы одну такую ошибку. Это – огромное преимущество компиляторов, которе отсутствует у интерпретаторов.

Ошибка 2. Имя функции записано неправильно.

a = int(input())
Print(a)

В этой программе имя функции Print неправильно записано с большой буквы. Программа по-прежнему после запуска выполнит первую строку – ввод данных, и только после этого выведет ошибку: «NameError: name 'Print' is not defined».

Ошибка 3. Несоответствие типов при вызове функции.

Бывает так, что мы хотим выполнить операцию над типом, который для этого не предназначен. При запуске следующей программы

from math import *
print(sqrt('Python'))

возникнет ошибка «TypeError: must be real number, not str». Это означает, что функция sqrt не может быть применена к строкам – только к вещественным числам.

Ошибка 4. Несоответствие типов при выполнении операции.

Бывают ситуации, когда мы пытаемся делать какие-то операции над типами, которые для этого не предназначены. При запуске следующей программы

s = input()
print(s + 1)

мы вначале введём строку в переменную s, а при выполнении второй строки получим ошибку «TypeError: can only concatenate str (not "int") to str», что означает, что строку нельзя складывать с числом.

Вывод. Семантические ошибки на Python диагностируются поздно, что приводит к программам, которые заведомо содержат ошибку, но могут быть запущены и успешно проработают какое-то время. Такие программы более опасны чем те, которые сразу не запускаются из-за ошибок синтаксиса, потому что, если программа запускается, это создаёт ложное ощущение её безопасности.