加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

保举 | Python七步捉虫法

发布时间:2019-03-11 04:07:09 所属栏目:建站 来源:Maria Mckinley
导读:相识一些能力助你镌汰代码查错时刻。 在周五的下战书三点钟(为什么是这个时刻?由于工作总会在周五下战书三点钟产生),你收到一条关照,客户发明你的软件呈现一个错误。在有了起源的猜疑后,你接洽运维,查察你的软件日记以相识产生了什么,由于你记得收到过
副问题[/!--empirenews.page--]

保举 | Python七步捉虫法

相识一些能力助你镌汰代码查错时刻。

在周五的下战书三点钟(为什么是这个时刻?由于工作总会在周五下战书三点钟产生),你收到一条关照,客户发明你的软件呈现一个错误。在有了起源的猜疑后,你接洽运维,查察你的软件日记以相识产生了什么,由于你记得收到过日记已经搬迁了的关照。

功效这些日记被转移到了你获取不到的处所,但它们正在导入到一个网页应用中——以是到时辰你可以用这个大度的应用来检索日记,可是,这个应用此刻还没完成。这个应用估量会在几天内完成。我知道,你认为这完全不切现实。然而并不是,日记可能日记动静好像常常在错误的时刻消散不见。在我们开始查错前,一个忠告:常常搜查你的日记以确保它们还在你以为它们应该在的处所,并记录你以为它们应该记的对象。当你不留意的时辰,这些对象每每会产生令人惊奇的变革。

好的,你找到了日记可能实行了呼唤运维职员,而客户确实发明白一个错误。乃至你也许以为你已经知道错误在哪儿。

你当即打开你以为也许有题目的文件并开始查错。

1、先不要碰你的代码

阅读代码,你乃至也许会想到该阅读哪些部门。可是在开始搅散你的代码前,请重现导致错误的挪用并把它酿成一个测试。这将是一个集成测试,由于你也许尚有其他疑问,今朝你还不能精确地知道题目在哪儿。

确保这个测试功效是失败的。这很重要,由于偶然你的测试不能重现失败的挪用,尤其是你行使了可以夹杂测试的 web 可能其他框架。许多对象也许被存储在变量中,但遗憾的是,,只通过调查测试,你在测试里挪用的对象并不老是明明可见的。当我实行着重现这个失败的挪用时,我并不是说我要建设一个可以通过的测试,可是,好吧,我确实是建设了一个测试,但我不以为这出格不通俗。

从本身的错误中汲取教导。

2、编写错误的测试

此刻,你有了一个失败的测试,可能也许是一个带有错误的测试,那么是时辰办理题目了。可是在你开干之前,让我们先搜查下挪用栈,由于这样可以更轻松地办理题目。

挪用栈包罗你已经启动但尚未完成地全部使命。因此,好比你正在烤蛋糕并筹备往面糊里加面粉,那你的挪用栈将是:

  • 做蛋糕
  • 打面糊
  • 加面粉

你已经开始做蛋糕,开始打面糊,而你此刻正在加面粉。往锅底抹油不在这个列表中,由于你已经完成了,而做糖霜不在这个列表上由于你还没开始做。

假如你对换用栈不清晰,我凶猛提议你行使 Python Tutor,它能帮你在执行代码时调查挪用栈。

此刻,假如你的 Python 措施呈现了错误, Python 表明器会帮你打印出当前挪用栈。这意味着无论那一时候措施在做什么,很明明错误产生在挪用栈的底部。

3、始终先搜查挪用栈底部

在栈底你不只能看到产生了哪个错误,并且凡是可以在挪用栈的最后一行发明题目。假如栈底对你没有辅佐,而你的代码还没有颠末代码说明,那么行使代码说明长短常有效的。我保举 pylint 可能 flake8。凡是环境下,它会指出我一向忽略的错误的处所。

假如错误看起来很疑惑,你下一步动作也许是用 Google 搜刮它。假如你搜刮的内容不包括你的代码的相干信息,如变量名、文件等,那你将得到更好的搜刮功效。假如你行使的是 Python 3(你应该行使它),那么搜刮内容包括 Python 3 是有辅佐的,不然 Python 2 的办理方案每每会占有大大都。

好久早年,开拓者必要在没有搜刮引擎的辅佐下办理题目。那是一段暗中年华。充实操作你可以行使的全部器材。

不幸的是,偶然辰题目产生在更早阶段,但只有在挪用栈底部执行的处所才展现出来。就像当蛋糕没有膨胀时,健忘加发酵粉的事才被发明。

那就该搜查整个挪用栈。题目更也许在你的代码而不是 Python 尺度库可能第三方包,以是先搜查挪用栈内你的代码。其它,在你的代码中安排断点凡是会更轻易搜查代码。在挪用栈的代码中安排断点,然后看看周围是否如你预期。

“可是,玛丽,”我听到你说,“假如我有一个挪用栈,那这些都是有辅佐的,但我只有一个失败的测试。我该从那边开始?”

pdb,一个 Python 调试器。

找到你代码里会被这个挪用掷中的处所。你应该可以或许找到至少一个这样的处所。在哪里打上一个 pdb 的断点。

一句题外话

为什么不行使 print 语句呢?我曾经依靠于 print 语句。偶然辰,它们如故很利便。但当我开始处理赏罚伟大的代码库,尤其是有收集挪用的代码库,print 语句就变得太慢了。我最终在各类处所都加上了 print 语句,但我没法追踪它们的位置和缘故起因,并且变得更伟大了。可是首要行使 pdb 尚有一个更重要的缘故起因。假设你添加一条 print 语句去发明错误题目,并且 print 语句必需早于错误呈现的处所。可是,看看你放 print 语句的函数,你不知道你的代码是怎么执行到谁人位置的。查察代码是探求挪用路径的好要领,但看你早年写的代码是可怕的。是的,我会用 grep 处理赏罚我的代码库以探求挪用函数的处所,但这会变得乏味,并且搜刮一个通用函数时并不能缩小搜刮范畴。pdb 就变得很是有效。

你遵循我的提议,打上 pdb 断点并运行你的测试。然而测试再次失败,可是没有任何一个断点被掷中。留着你的断点,并运行测试套件中一个同这个失败的测试很是相似的测试。假如你有个不错的测试套件,你应该可以或许找到一个这样的测试。它会掷中了你以为你的失败测试应该掷中的代码。运行这个测试,然后当它运行到你的断点,按下 w 并搜查挪用栈。假如你不知道怎样查察由于其他挪用而变得紊乱的挪用栈,那么在挪用栈的中间找到属于你的代码,并在仓库中该代码的上一行安排一个断点。再试一次新的测试。假如如故没命间断点,那么继承,向上追踪挪用栈并找出你的挪用在那边脱轨了。假如你一向没有命间断点,最后到了追踪的顶部,那么恭喜你,你发明白题目:你的应用措施名称拼写错了。

没有履历,小白,一点都没有履历。

4、修改代码

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读