содержание | Предыдущий раздел (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…