首页 体育世界正文

贝加尔湖,三步学会 Debug 神器,功率提高不少!,守株待兔

P五鼠战长沙DB是Python自带的一个包,为Python程序供给了一种交互的源代码调试功用,首要特性包含设置断点、单步调试、进入函数调试、查看当时代码、查看栈片段、动态改动变量的值等。

发动调试东西

运用PDB的榜首步是让解说器在恰当贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑的时分进入调试东西。能够选用许多不同的方同城情人法

到达这个意图,详细取决于开始条件和所要调试的内容。

从指令行履行:

PDB的最直接的办法是经过指令皮国涌行运转,指令格局如下:

python3 -m pdb py文件

这儿咱们来个小比方贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑,有一个文件名为1.py,代码如下:

def foo(num):
print(f"当时的数字是:{num}")
if __name__ == '__main__':
foo(3)

然后再指令行中定位到当时方位。

经过指令行运转PDB

一般PDB在打印一个文件名时会在输出中包含各模块的完好途径,然后会显现出下一行即将运转的代码。这个里的话便是接下来将运转函数foo了。

在解说器中运转:

假如在交互式环境下运转调试东西,能够运用run()或许runeval()。

在程序中运转:

上面的状况仅仅合适一开始就发动调试东西,关于长期的并且需求运转一段时间才去进行调试的状况,更便利的做法便是在需求运转的代码之前加set_trace()办法了。

set_trace()能够在恣意方位进行调用,像下面重生之黄埔军魂的比方。

import pdb
def foo(nu贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑m):
print(f"当时的数字是:{num}")
for i in range(num):
pdb.set_trace()
print(f"当时循环的数字:{i}")
if __name__ == '__main__':
foo(10)

上面的代码在for循环中打了一个断点,能够发现咱们程序停在了for循环的方位,然后显现出下一行即将履行的内容

print(f"当时循环的数字:{i}")
怎样知道循环到第几个数字呢?

答:经过直接输入变量i能够看到当时的值。

怎样知道当时的代码运转到哪了?4虎

答:经过指令where(简写w)能够得出正在履行哪一行,以及程序的调用栈的方位。

怎么查看邻近当然代码邻近的代码信息?

答:经过list(简写l)能够和妈妈生孩子看周围的代码默许是上5行、下5行。别的指令longlist(简写ll)能够输出当时的函数的源码。假如需求看整个类的源码能够经过source+类名获取源码。

常用指令

过程履行:

step(简称s):函数单步履行,假如遇到函数会进宜宾学医吧入函数内部持续调试,假如不需求进入函数体仅仅一步一步履行,此刻就要用下面的next了。

next(简称n):单步履行指令,不会进入函数体,可是向之前贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑说的那个假如遇到了一个for循环10次还好假如是10000次呢,此刻就要用到下面的指令了。

until:该指令类型next,只不过它会持续履行,直到履行到同一个函数中行号大于当时值的一行,也便是说能够用until跳出循环结尾。当然until也能够指定一个比当时行号大的值,调到指定方位。

一个比方:

import pdb
class Myobj():
def foo(self,num):
print(f"当时的数字是:{num}")
pdb.set_trace()
for i in range(num):
print(f"当时循环的数字:{i}")
print("over")
if __name__ == '__main__':
m=Myobj()
m.foo(4)

能够发现履行until把整个循环走了一遍,然后到下一行也便是。

-> print("over")
return:return建始汪大勇也能够绕开一段代码的捷径,只不过它会持续履行。
直至函数预备履行一个retu贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑rn句子,然后会暂停,使得在函数回来之前能够看到回来值。

一个没什么实践用处的比方,不过能够很好地演示这个作用。

ipvcp集团mport pdb
ls截获芒果果核象甲t=[]
class Myobj():
def foo(self,num):
print(f"当时的数字是:{num}")
pdb.set_trace()
for i in range(num):
print(f仙墓陆云"当时循环的数字:{i}")
lst.append(i)
return lst
if __name__ == '__main__':
m=Myobj()
m.foo(4)

断点相关:

break(简称b): 当然跟着代码的增加即便运用return和until或许next都很费时间,此刻就要考虑在指定方位设置断点的办法了,假如要在文件的一个特定行设置断点,能够运用break lineno,然后经过下面的continue(简写c)指令调到下一个断点。

咱们还能够指定在某个函数中设置断点比方:break Myobj().foo。

除此之外还能够履行其他文件设置断点贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑,也能够相当于sys.path大将某个文件的相对途径。假如只履行break指令能够看到哪些地方有断点,包含哪个文件行号等信息。

disable:能够指定上面break之后显现的断点,履行后能够发现之前Enb栏有yes变为false。此刻输入l能够看到打断点的为会有B标识。

假如想完全删去就需求履行clear指令了。

增加和删去断点作用展现图

clear:完全删去一个断点,运用办法clear id号,类型disable。

tbreak:暂时断点,程序榜首次履行到暂时断点时会主动铲除。不必再去手动删去了。

条件断点:

能够对断点运用一些规矩,以便其仅当条件满意时才履行。与手动启用和禁用断点比较,运用条件断点能够更好地操控调试器暂停程序的办法。

条件断点能够经过两种办法设置。榜首种办法是指定运用break设置断点时的条件。运用办法是代码行号加表达式。霍启刚真爱的是卢恬儿看一个运用比方。

import pdb
lst = []
class Myobj():
pdb.set_trace()
def foo(self, npokemomum):
print(f"当时的数字是:{num}")
if __name__ == '__main__':
m = Myobj()
[m.foo(i) fo涉传672r i in range(10)]

解析下图中指令的意义:

1.break 10,num>5,是指在第10行打断点,然后条件是num>5的时分,经过后边输出break能够看到详细的断点信息,很明显看到咱们的断点条件贝加尔湖,三步学会 Debug 神器,功率进步不少!,刻舟求剑。

stop only if num>5

2.假如表达式的计算成果为true,则履行将在断点处中止。

除此之外,还能够运用条件指令将条孤单毅力手镯件运用于现有断点。参数是断点id和表达式。

仍是上面的代码让咱们看作用图。

疏忽断点

假如在循环的过程中想疏忽前几条成果,比方这儿疏忽前3个,就能够运用ignore。

运用办法是:

ignore 断点id 疏忽次数。
假如在运转之前德阳赵辉微博不想疏忽了能够运用下面指令,假如现已运转continue申港3路了的话就没作用了。
ignore 断点id 0

监督变量:

display:有时分咱们需求实时调查一个变量的改动,这个时分dispaly便是最好的辅佐,假如想移出能够运用undisplay。

display监督变量

改动作业流:

jump:jump指令在运转时改动程序的流程,而不修正代码。 它能够向前越过以防止运转某些代码,也能够向后跳转以再次运转它。

import pdb
def f(n):
pdb.set_trace()
result = []
j = 0
for i in range(n):
j = i * n + j
j += n
resul夏夕颜欧爵t.append(j)
return result123118
if __name__ == '__main__':
print(f(5))

向前跳:

向前跳转会将履行点移动到当时方位之后,而不会履行期间任何句子。

向后跳:

跳转还能够将程序履行移动到现已履行的句子中,以便再次运转它。

不允许的jump办法

1.跳入和跳出某些流操控句子,无法判别什么时分进入。

2.跳转能够用来输入函数,可是不给参数,代码也不能作业。

3.跳转不会进入for循环或try:except句子等块的中心。

4.finally块中的代码有必要悉数履行,因而跳转不会脱离该块。

5.最基本的约束是跳转被约束在调用仓库的底部框架上。 向上移动仓库以查看变量后,此刻无法更改履行流程。

其他指令

  • up(简称u):能够向栈中较旧的帧移动
  • down(简称d):能够向栈中较新的帧移动。每次在栈中上移或许下移时,调试东西都会打印当时方位,格局与where生成的格局相同。
  • args(简称a):能够打印当时函数的一切参数的值。
  • p和pp:这两个是相似python的print和pprint的功用。输出信息的,pp带有美化功用。
  • !:在一个表达式前面加一个!,能够修正python程序当时正在运转的值,比方上面的比方num等于10,假如履行!num=3,后边再输出num你会看到此刻的num变成3了,这个能够削减测验时分咱们的循环次数了。当然这个循环次数是否能够变化仍是看程序的逻辑。
  • 参考资料

https://docs.python.org/3.7/library/pdb.html

作者简介:陈祥安,高档爬虫工程师,从业多年,有着丰厚的爬虫作业经验,从c#言语转入到Python言语,拿手各种爬虫技能,了解大规模爬虫开发,酷爱并喜爱研究Python。欢迎我们和我一起来交流学习。

本文系作者投稿,版权归作者一切。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

华清池,1-4月全国房地产开发出资34217亿元 同比增加11.9%,杀死一只知更鸟

  • 倒春寒,夏目友人帐:人生而孤单,但仍然灿烂美丽,十年之约按期而至,人民币兑日元

  • 蜜蜂,古代谁家的城墙最顶造?没有钢筋水泥,为何能如此巩固?,凌