Язык программирования Python.

Отладка.

В интерпретаторе языка Python заложены возможности отладки программ, а в стандартной поставке имеется простейший отладчик — pdb. Следующий пример показывает программу, которая подвергается отладке, и типичную сессию отладки:

# File myfun.py.

Def fun(s):

 lst = [].

 for i in s:

  lst.append(ord(i)).

 return lst.

Так может выглядеть типичный процесс отладки:

>>> import pdb, myfun.

>>> pdb.runcall(myfun.fun, «ABCDE»).

> /examples/myfun.py(4)fun().

-> lst = [].

(Pdb) n.

> /examples/myfun.py(5)fun().

-> for i in s:

(Pdb) n.

> /examples/myfun.py(6)fun().

-> lst.append(ord(i)).

(Pdb) l.

1   #!/usr/bin/python.

2   # File myfun.py.

3   def fun(s):

4    lst = [].

5    for i in s:

6 ->  lst.append(ord(i)).

7    return lst.

[EOF].

(Pdb) p lst.

[]

(Pdb) p vars().

{'i': 'A', 's': 'ABCDE', 'lst': []}.

(Pdb) n.

> /examples/myfun.py(5)fun().

-> for i in s:

(Pdb) p vars().

{'i': 'A', 's': 'ABCDE', 'lst': [65]}.

(Pdb) n.

> /examples/myfun.py(6)fun().

-> lst.append(ord(i)).

(Pdb) n.

> /examples/myfun.py(5)fun().

-> for i in s:

(Pdb) p vars().

{'i': 'B', 's': 'ABCDE', 'lst': [65, 66]}.

(Pdb) r.

- Return -

> /examples/myfun.py(7)fun() — >[65, 66, 67, 68, 69].

-> return lst.

(Pdb) n.

[65, 66, 67, 68, 69].

>>>

Интерактивный отладчик вызывается функцией pdb.runcall() и на его приглашение (Pdb) следует вводить команды. В данном примере сессии отладки были использованы некоторые из следующих команд: l (печать фрагмент трассируемого кода), n (выполнить все до следующей строки), s (сделать следующий шаг, возможно, углубившись в вызов метода или функции), p (печать значения), r (выполнить все до возврата из текущей функции).

Разумеется, некоторые интерактивные оболочки разработчика для Python предоставляют функции отладчика. Кроме того, отладку достаточно легко организовать, поставив в ключевых местах программы, операторы print для вывода интересующих параметров. Обычно этого достаточно, чтобы локализовать проблему. В CGI–сценариях можно использовать модуль cgitb, о котором говорилось в одной из предыдущих лекций.