python写代码步骤
星期五下午三点。 为什么? 因为事情总是在星期五下午3点。 您会收到一条通知,告知客户客户在您的软件中发现了一个错误。 克服最初的疑虑后,您可以与DevOps联系,以了解应用日志的状况,因为您记得收到了有关它们已被移动的通知。
事实证明它们是您无法到达的地方,但是它们正处于移至Web应用程序的过程中-因此您将拥有一个漂亮的应用程序来搜索和阅读它们,但是当然,它还没有完成。 几天后就可以了。 我知道,完全不现实的情况,对吗? 不幸的是没有; 似乎日志或日志消息经常在错误的时间丢失。 在我们跟踪该错误之前,有一条公共服务公告:检查您的日志以确保它们位于您认为的位置,并定期记录您认为应该记录的内容。 当您不看这些东西时,它们会发生怎样的变化,真是太神奇了。
好的,所以您找到了日志或尝试了呼叫,确实,客户发现了一个错误。 甚至您可能以为您知道错误在哪里。
您立即打开您认为可能是问题的文件,然后开始四处查看。
1.请勿触摸您的代码
继续研究它,甚至可能提出一个假设。 但是在您开始研究代码之前,请先进行调用以创建错误并将其转换为测试。 这将是一个集成测试,因为尽管您可能会怀疑,但您仍不确定确切的问题出在哪里。
确保此测试失败。 这很重要,因为有时您进行的测试不会模仿未接来电。 如果您使用的网络或其他框架可能混淆测试,则尤其如此。 许多事情可能存储在变量中,但是不幸的是,并非总是显而易见的,仅通过查看测试,您在测试中进行的调用即可。 我并不是要说我已经创建了一个在尝试模仿中断呼叫时通过的测试,但是,嗯,我已经这样做了,我认为这不是特别寻常。 从我的错误中学习。
2.编写失败的测试
现在您的测试失败,或者测试有错误,现在该进行故障排除了。 但是在您进行此操作之前,让我们先检查一下堆栈,因为这使故障排除更加容易。
堆栈包含您已开始但尚未完成的所有任务。 因此,如果您要烘烤蛋糕并将面粉添加到面糊中,那么您的堆栈将是:
- 做蛋糕
- 做面糊
- 加面粉
如果您对堆栈感到困惑,我强烈建议您在Python Tutor上玩,在执行代码行时您可以在其中观察堆栈。
现在,如果您的Python程序出了点问题,解释器将为您打印出有用的堆栈。 这意味着无论程序在做什么,现在都可以发现问题出在底层。
3.始终先检查堆栈底部
不仅堆栈底部可以看到发生了什么错误,而且堆栈的最后一行通常可以找到问题所在。 如果底部无济于事,并且您的代码已经有一段时间没有被删除了,那么运行它的帮助就令人惊讶。 我建议使用pylint或flake8。 它经常指向我一直忽略的错误所在。
如果错误看上去有些晦涩,则您的下一步可能只是向Google寻求帮助。 如果您不包括仅与代码相关的信息(例如变量,文件的名称等),那么运气会更好。如果您使用的是Python 3(应该使用Python 3),将很有帮助。搜索; 否则,Python 2解决方案往往占据主导地位。
从前,开发人员不得不在没有搜索引擎好处的情况下进行故障排除。 这是一个黑暗的时期。 利用所有可用的工具。
不幸的是,有时该问题较早发生,并且仅在堆栈底部执行的那一行中才变得明显。 想一想当蛋糕不升起时,如何忘记添加发酵粉会变得很明显。
现在该查询堆栈了。 问题很可能出在您的代码中,而不是Python核心甚至是第三方软件包中,这很有可能,因此请首先扫描堆栈以查找代码中的行。 另外,通常在您自己的代码中放置断点通常要容易得多。 将断点放在代码中再向上一点,环顾四周,看看事情看起来是否应该看起来像是应该的。
“但是玛丽亚,”我听到你说,“如果我有堆栈跟踪信息,但是对我来说测试失败,这对我很有帮助。我应该从哪里开始?”
Pdb,Python调试器。
在您的代码中找到您知道此调用应该到达的位置。 您应该至少可以找到一个地方。 在其中粘贴pdb中断。
题外话
为什么不打印声明? 我以前依赖打印语句。 有时它们仍然派上用场。 但是一旦我开始使用复杂的代码库,尤其是进行网络调用的代码库,打印就变得太慢了。 我最后到处都是打印语句,我不知道它们在哪里以及为什么,而且变得很复杂。 但是,还有一个更重要的原因是主要使用pdb。 假设您输入了一条打印语句,发现出了点问题—而且一定早就出错了。 但是,看看放置打印语句的函数,您不知道如何到达那里。 查看代码是了解您要去往哪里的好方法,但是对于学习过的地方却很糟糕。 是的,我在代码库中做了一个grep,以查找调用函数的位置,但这会变得很乏味,并且无法通过常用函数将其缩小很多。 Pdb可能非常有帮助。
您遵循我的建议,并在pdb中中断并运行测试。 它突然消失并再次失败,一点也没有中断。 保留断点,并在测试套件中已经运行了一个测试,该测试的功能与损坏的测试非常相似。 如果您有一个不错的测试套件,则应该能够找到与您认为失败的测试应该击中的代码相同的测试。 运行该测试,当它到达断点时,执行w
并查看堆栈。 如果您不了解堆栈,另一个调用可能如何/在哪里发生混乱,请往堆栈中途走一圈,找到属于您的代码,然后在该文件中放置一个断点,在该文件的上方一行在堆栈跟踪中。 使用新测试再试一次。 继续来回移动,向上移动堆栈,找出呼叫出轨的地方。 如果您一直走到跟踪的顶部而没有遇到断点,那么恭喜您,您已经找到了问题:您的应用拼写错误。 这里没有经验,不,完全没有。
4.改变事物
如果仍然感到迷茫,请尝试进行新的测试,以使您稍有不同。 您可以使新测试生效吗? 有什么不同吗? 有什么关系 尝试更改其他内容。 一旦进行了测试,或者可能进行了其他测试,就可以安全地开始更改代码中的内容,以查看是否可以缩小问题的范围。 切记以全新的提交开始故障排除,以便您可以轻松撤消无济于事的更改。 (这是对版本控制的引用,如果您不使用版本控制,它将改变您的生活。嗯,也许它会使编码变得更容易。有关详细介绍,请参见“ 版本控制的可视指南 ”。)
5.休息一下
认真地说,当它不再是一种有趣的挑战或游戏而变得令人沮丧时,您最好的选择就是摆脱问题。 休息一下。 我强烈建议您散步并尝试考虑其他事情。
6.写下所有内容
当您回来时,如果您没有突然受到尝试的启发,请写下有关该问题的所有信息。 其中应包括:
- 正是造成问题的电话
- 到底发生了什么,包括任何错误消息或相关的日志消息
- 正是您所期望的
- 到目前为止,您已完成的工作以查找问题以及在故障排除过程中发现的任何线索
有时候,这是很多信息,但是请相信我,试图从零散的人中窃取信息真的很烦人。 尽量简明扼要,但要完整。
7.寻求帮助
我经常发现,只要写下所有信息,就会引发对我尚未尝试过的事情的思考。 当然,有时候,我点击“ 提交”按钮后立即意识到问题出在哪里。 无论如何,如果您在写下所有内容后仍然没有想到任何事情,请尝试向某人发送电子邮件。 首先,请尝试与您的项目相关的同事或其他人员,然后再进入项目电子邮件列表。 不要害怕寻求帮助。 大多数人都是善良且乐于助人的,我发现在Python社区中尤其如此。
玛丽亚·麦金利(Maria McKinley)将于2月23日至24日在西雅图举行的PyCascades 2019大会上展示《 狩猎臭虫》 。
翻译自: https://opensource.com/article/19/2/steps-hunting-code-python-bugs
python写代码步骤