Сейбел: Какие инструменты вы используете при отладке?
Томпсон: В основном вывод на печать. При разработке программы я размещаю очень много операторов вывода на печать.
- Во время разработки можно выводить сообщения на экран
- В продакшене, пишем сообщения уже в логгер (syslog, просто в файл)
- Можем настраивать режими отладки
from dataclasses import dataclass
@dataclass
class MyObj:
n: int
def go(self):
for i in range(self.n):
print(i)
if __name__ == "__main__":
MyObj(5).go()
python -m pdb ./myobj.py
Можно вызвать в рамках Python-сессии
import pdb
from myobj import MyObj
pdb.run("MyObj(5).go()")
Чаще всего может потребоваться перейти в режим отладки в определённом месте программы
# тут какой-то код
def main(request):
import pdb # ipdb
pdb.set_trace() # ipdb.set_trace()
data = request.GET
# дальше много кода
try:
some_code()
except:
import sys
import ipdb
tb = sys.exc_info()[2]
ipdb.post_mortem(tb)
- h(elp) [command]: выведет подсказку по доступным командам
- a(rgs): напечать аргументы текущей функции (текущего стека вызовов)
- p : напечатать содержимое переменной или результат вызова
- pp : красиво напечатать
- w(here): покажет стектрейс как вы очутились в текущем месте кода
- l(ist) [start [end]]: выведет по 5 строк вокруг текущей или вокруг заданной, либо выведет строки со start по end
- u(p) / d(own): перемещение по стеку вызовов
- ! выражение: выполнить выражение, например переопределить значение переменной
- s(tep): зайти внутрь вызова
- n(ext): следующая строка кода
- b(reak) [ ([filename:]lineno | function) [, condition] ]: добавить точку останова
- tbreak [([filename:]lineno | function) [, condition]]: одноразовая точка останова
- condition bpnumber [condition]: добавить условие для точки останова
- disable / enable tbnumber: выкл / вкл точку останова
- cl(ear) (filename:lineno | bpnumber): удалить точку останова
python -m pudb myobj.py
WERKZEUG_DEBUG_PIN=1234 \
python manage.py runserver_plus