Процес налагодження
Ви повинні розуміти, що насправді ви використовуєте різну інтеграцію налагоджувача Pythonpdb
і ipdb
(яка використовує, pdb
а до якої можна отримати доступ за допомогою модуля ipdb
). Сподіваюся, цей тривіальний приклад допоможе вам краще використовувати його.
Припустимо, ви хочете налагодити цей код:
def Waiting_fun():
for i in range(100):
pass
def New_sum(lista, to_s = False):
result = 0
print 1
for i in lista:
print "summed"
result +=i
Waiting_fun()
if to_s:
result = str(result)
return result
a = New_sum([1,4,5,7,8])
b = New_sum([1,4],1)
c = 456
d = New_sum([6,8,9],1)
final_result = a*b*c*d
Out: Type error
Швидка перша налагодження за допомогою налагодження iPython%
%debug
Перше, що я роблю, це викликати pdb з iPython за допомогою магічної команди %debug
, ви можете встановити його як механізм за замовчуванням, використовуючи %pdb
.
%debug
> /home/opdate/Desktop/test.py(23)<module>()
19 a = New_sum([1,4,5,7,8])
20 b = New_sum([1,4],1)
21 c = 456
22 d = New_sum([6,8,9],1)
---> 23 final_result = a*b*c*d
Після обіду pdb
. Ви можете знайти всі команди в офіційних документах або скористатися командою h
для їх відображення. На цьому етапі єдиними командами, які я використовую, є:
p
: друкує вказані вами змінні
pp
: гарні принти
args
: якщо ви знаходитесь всередині функції, вона друкує аргументи
pp locals()
: може бути корисним для друку всіх змінних, але в більшості випадків це безлад!
!
використовуйте його, якщо хочете уникнути конфліктів із командами, переліченими в h
whatis
ім'я_змінної: еквівалент типу (ім'я_змінної)
u
.
d
: Перемістіть поточний кадр на один рівень вниз у трасі стека (до нового кадру).
q
: після закінчення ви можете використовувати q для виходу
У нашому випадку:
ipdb> pp a,b,c,d
(25, '5', 456, '23')
Або ipdb> !a,b,c,d
(без пробілу між знаком оклику та першим значенням). Зрозуміло, що b і d - це рядки на випадок, якщо ми можемо використовувати:
ipdb> whatis b
<type 'str'>
Заглиблюючись, використовуючи точки зупинку
70% випадків %debug
вказує на рішення. Коли вам потрібні додаткові функції, такі як точки зупинку , пора використовувати Spyder. У цьому випадку ми хочемо зрозуміти, чому b
рядок ми ставимо поруч із ним (двічі клацніть поруч із номером рядка у вікні редактора). Я вважаю, що набагато краще використовувати стандартну консоль Python замість консолі IPython для налагодження, тому виберіть консоль перед початком налагодження:
Потім відкрийте, variable explorer
якщо є якісь змінні, видаліть їх. Я використовую Ctrl+ F5для запуску налагодження, ви можете використовувати кнопки вгорі, але я волію використовувати їх ярлики, показані нижче:
(Pdb) c
(Pdb) s
(Pdb) args
(Pdb) s
(Pdb) ⏎
(Pdb) whatis result
(Pdb) unt
(Pdb) n
(Pdb) s
(Pdb) whatis result
(Pdb) j 6
(Pdb) tbreak 12
(Pdb) c
(Pdb) j 6
(Pdb) whatis result
Тепер ми виявили помилку. Ми також можемо протестувати рішення, повторюємо крок до 12 і встановлюємоto_s = False
(Pdb) to_s = False
Це працює. Однією з важливих особливостей використання стандартного pdb на консолі Python є те, що у вас є автоматична конкуренція, і ви можете використовувати дослідник змінних замість використання whatis
і pp
:
Використовуючи провідник змінних, ви також можете змінити значення змінних, що робить справи ще швидшими.
Умовні точки зупинку
Ще одним розумним способом виявити помилку є використання умовної точки зупинку ( Shift+ F12), великою перевагою Spyder є налагодження та використання точок зупинки списку. Умовні точки зупину активується , коли умова True
В нашому випадку, ми хочемо , щоб визначити , де б стає рядком , тому умова: type(b) == str
. Зазвичай я розміщую багато умовних точок зупинку і бачу, які відповідають умові. Для цього не використовуйте Shift+, F12а двічі клацніть поруч із рядком звичайні точки зупинки та перейдіть до Налагодження-> Список точок зупинки та скопіюйте та перенесіть умову в таблиці до кожної точки зупинку, як показано на малюнку нижче.
Звідси команди, які слід використовувати:
(Pdb) c
(Pdb) u
(Pdb) d
sys.exit()
тимчасово, але було б зручніше, якби у мене була можливість зупинки.