Перевод: "Практическое программирование на Python" 08_03_Отладка

Python
Перевод: "Практическое программирование на Python" 08_03_Отладка

содержание | Предыдущий раздел (8.2 Журналы) | Следующий раздел (9 пакетов)

8.3 Отладка

Совет по отладке

Предположим, что программа вылетает:

bash % python3 blah.py
Traceback (most recent call last):
  File "blah.py", line 13, in ?
    foo()
  File "blah.py", line 10, in foo
    bar()
  File "blah.py", line 7, in bar
    spam()
  File "blah.py", 4, in spam
    line x.append(3)
AttributeError: 'int' object has no attribute 'append'

Что теперь делать?

Чтение информации об обратной трассировке

Последняя строка — это конкретная причина сбоя программы:

bash % python3 blah.py
Traceback (most recent call last):
  File "blah.py", line 13, in ?
    foo()
  File "blah.py", line 10, in foo
    bar()
  File "blah.py", line 7, in bar
    spam()
  File "blah.py", 4, in spam
    line x.append(3)
# Cause of the crash
AttributeError: 'int' object has no attribute 'append'

Однако информацию о трассировке не всегда легко прочитать или понять.

Совет для профессионалов: вставьте всю обратную трассировку в Google.

Использование интерактивного интерпретатора (REPL)

При выполнении скрипта вы можете использовать опции-iПоддержите Python в живых.

bash % python3 -i blah.py
Traceback (most recent call last):
  File "blah.py", line 13, in ?
    foo()
  File "blah.py", line 10, in foo
    bar()
  File "blah.py", line 7, in bar
    spam()
  File "blah.py", 4, in spam
    line x.append(3)
AttributeError: 'int' object has no attribute 'append'
>>>

Опции-iСостояние интерпретатора может быть сохранено. Это означает, что сообщения об ошибках можно найти после сбоя программы. Проверьте значение переменных и другие состояния.

Отладка с печатью

использоватьprint()Очень часто отлаживают функции.

Рекомендация: убедитесь, что вы используетеrepr()функция.

def spam(x):
    print('DEBUG:', repr(x))
    ...

repr()Функция отображает точное представление значения, а не корректный вывод.

>>> from decimal import Decimal
>>> x = Decimal('3.4')
# NO `repr`
>>> print(x)
3.4
# WITH `repr`
>>> print(repr(x))
Decimal('3.4')
>>>

Отладчик для Python

Отладчик можно запустить вручную внутри программы.

def some_function():
    ...
    breakpoint()      # Enter the debugger (Python 3.7+)
    ...

Вышеуказанные операции будутbreakpoint()Запускает отладчик при вызове.

В более ранних версиях Python вы могли увидеть такое руководство по отладке:

import pdb
...
pdb.set_trace()       # Instead of `breakpoint()`
...

(Аннотация: После Python 3.7 можно использовать встроенные функцииbreakpoint()заменять import pdb; pdb.set_trace())

Запускаем программу под интерпретатором отладки

Также можно запустить всю программу под отладчиком:

bash % python3 -m pdb someprogram.py

Приведенное выше автоматически войдет в отладчик перед первой строкой операторов, что позволит вам установить точки останова и изменить конфигурацию.

Общие команды отладчика:

(Pdb) help            # Get help
(Pdb) w(here)         # Print stack trace
(Pdb) d(own)          # Move down one stack level
(Pdb) u(p)            # Move up one stack level
(Pdb) b(reak) loc     # Set a breakpoint
(Pdb) s(tep)          # Execute one instruction
(Pdb) c(ontinue)      # Continue execution
(Pdb) l(ist)          # List source code
(Pdb) a(rgs)          # Print args of current function
(Pdb) !statement      # Execute statement

Расположение точки останова может быть выражено любым из следующих способов:

(Pdb) b 45            # Line 45 in current file
(Pdb) b file.py:45    # Line 34 in file.py
(Pdb) b foo           # Function foo() in current file
(Pdb) b module.foo    # Function foo() in a module

Упражнение

Упражнение 8.4: Ошибки Что такое ошибки?

Если есть ошибка, мы исправляем ее (Он работает. Отправляйте его!).

содержание | Предыдущий раздел (8.2 Журналы) | Следующий раздел (9 пакетов)

Примечание. Полный перевод см.GitHub.com/co Статья 3 — /PRA…