Мой апплет [банк вопросов для интервью по программированию]
содержание
- болтовня
- Введение
- Возьмите простой каштан
болтовня
Во-первых, представим отладку pdb, pdb — это встроенный модуль python для отладки кода Python из командной строки. Может быть, вы скажете, что для отладки кода сейчас удобно использовать такие редакторы, как Pycharm, зачем использовать командную строку? Этот вопрос, я когда-то так и думал, до одного раза, код нужно запускать в системе Linux (теперь Pycharm тоже может удаленно отлаживать код, не будем об этом)
Введение
Как добавить точки останова?
Когда дело доходит до отладки, вы должны добавить точки останова.Есть два способа добавить точки останова:
- Добавьте строку после кода, который вы хотите поставить в точку останова
pdb.set_trace()
Если вы используете этот метод, вы можете начать отладку точки останова, непосредственно запустив файл Python.
- Используйте командную строку для добавления точек останова
b line_number(代码行数)
Если вы используете этот метод, вам потребуется python -m pdb xxx.py, чтобы запустить отладку точки останова.
Общие команды
Во-первых, давайте кратко представим используемые команды. Вам не нужно запоминать их здесь. Просто вернитесь и проверьте их, когда они вам понадобятся.
-
1 Войдите в режим отладки командной строки, python -m pdb xxx.py
-
2h: (помочь) помочь
-
3 w: (где) вывести текущий стек выполнения
-
4 D: (ВНИЗ) Выполнение Перейти к глубокому слою текущего стека (индивидуум не думает, что используется)
-
5 u: (вверх) выполнение переходит на предыдущий уровень текущего стека
-
6 b: (перерыв) Добавить точку останова
b 列出当前所有断点,和断点执行到统计次数 b line_no:当前脚本的line_no行添加断点 b filename:line_no:脚本filename的line_no行添加断点 b function:在函数function的第一条可执行语句处添加断点 -
7 tbreak: (temporary break) временная точка останова
在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样 -
8 кл: (очистить) очистить точку останова
cl 清除所有断点 cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点 cl lineno 清除当前脚本lineno行的断点 cl filename:line_no 清除脚本filename的line_no行的断点 -
9 disable: Отключить точку останова, параметр bpnumber, отличие от cl в том, что точка останова все еще существует, но не включена
-
10 Включить: Активировать точку останова, параметр является BPNUMBER
-
11 с: (шаг) выполнить следующую команду
如果本句是函数调用,则s会执行到函数的第一句 -
12 n: (следующий) выполнить следующий оператор
如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。 -
13 r: (возврат) выполнить текущую запущенную функцию до конца
-
14 c: (продолжить) продолжать выполнение до тех пор, пока не встретится следующая точка останова
-
15 l: (список) перечислить исходный код
l 列出当前执行语句周围11条代码 l first 列出first行周围11条代码 l first second 列出first--second范围的代码,如果second<first,second将被解析为行数 -
16 а: (аргументы) Функции, перечисляющие текущую выполняемую функцию
-
17 p выражение: (печать) вывести значение выражения
-
Выражение 18 pp: красивое выражение p
-
19 запуск: перезапустить отладку, эквивалентно перезапуску
-
20 q: (выйти) выйти из отладки
-
21 j lineno: (прыжок) Устанавливает функцию оператора, которая будет выполняться следующей
只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号 -
22) unt: (до) выполнить на следующую строку (выйти из цикла), или текущий стек заканчивается
-
23) условие bpnumber conditon, задайте условие для точки останова, когда параметр condition возвращает True, точка останова bpnumber действительна, в противном случае точка останова bpnumber недействительна
Возьмите простой каштан
Чтобы проверить использование pdb, я написал простой код Python следующим образом:
__author__ = 'zone'
__gzh__ = '公号:zone7'
import pdb
class MyScrapy:
urls = []
def start_url(self, urls):
pdb.set_trace()
for url in urls:
print(url)
self.urls.append(url)
def parse(self):
pdb.set_trace()
for url in self.urls:
result = self.request_something(url)
def request_something(self, url):
print('requesting...')
data = '''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
</html>'''
return data
scrapy= MyScrapy()
scrapy.start_url(["http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", ])
scrapy.parse()
Пример запуска: (Для удобства всеобщего чтения я добавил китайские комментарии, и при реальном запуске комментариев не будет)
D:\work\venv\Scripts\python.exe D:/work_test/test/pdb_test/pdb_test.py
> d:\work_test\test\pdb_test\pdb_test.py(11)start_url()
-> for url in urls:
(Pdb) n 注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(12)start_url()
-> print(url)
(Pdb) l 注释: l(list)列出当前代码
7 urls = []
8
9 def start_url(self, urls):
10 pdb.set_trace()
11 for url in urls:
12 -> print(url)
13 self.urls.append(url)
14
15 def parse(self):
16 pdb.set_trace()
17 for url in self.urls:
(Pdb) c 注释:c(continue),继续执行,知道遇到下一个断点
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
> d:\work_test\test\pdb_test\pdb_test.py(17)parse()
-> for url in self.urls:
(Pdb) n 注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(18)parse()
-> result = self.request_something(url)
(Pdb) l 注释: l(list)列出当前代码
13 self.urls.append(url)
14
15 def parse(self):
16 pdb.set_trace()
17 for url in self.urls:
18 -> result = self.request_something(url)
19
20 def request_something(self, url):
21 print('requesting...')
22 data = '''<!DOCTYPE html>
23 <html lang="en">
(Pdb) s 注释: s(step)这里是进入 request_something() 函数的意思
--Call--
> d:\work_test\test\pdb_test\pdb_test.py(20)request_something()
-> def request_something(self, url):
(Pdb) n 注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(21)request_something()
-> print('requesting...')
(Pdb) l 注释: l(list)列出当前代码
16 pdb.set_trace()
17 for url in self.urls:
18 result = self.request_something(url)
19
20 def request_something(self, url):
21 -> print('requesting...')
22 data = '''<!DOCTYPE html>
23 <html lang="en">
24 <head>
25 <meta charset="UTF-8">
26 <title>Title</title>
(Pdb) p url 注释:p(print)打印出 url 变量的数据
'http://www.zone7.cn'
(Pdb) n 注释:n(next)执行下一步
requesting...
> d:\work_test\test\pdb_test\pdb_test.py(31)request_something()
-> </html>'''
(Pdb) p data 注释:p(print)打印出指定变量的数据,这里由于赋值还没完成,所以报错
*** NameError: name 'data' is not defined
(Pdb) n 注释:n(next)执行下一步
> d:\work_test\test\pdb_test\pdb_test.py(32)request_something()
-> return data
(Pdb) p data 注释:p(print)打印出指定变量的数据
'<!DOCTYPE html>\n<html lang="en">\n<head>\n <meta charset="UTF-8">\n <title>Title</title>\n</head>\n<body>\n\n</body>\n</html>'
(Pdb) q 注释:q(quit)退出
Суммировать
В соответствии с приведенным выше примером можно изучить основы использования. Ключ в том, чтобы больше практиковаться самостоятельно. Я написал это сегодня и хочу написать статью об отладке производительности. Я не знаю, было ли у меня время в прошлом два дня.