Car*_*res 58 python debugging assert
我发现Python的断言语句是捕获永远不会发生的情况的好方法.当代码被认为是正确的时,可以通过Python优化删除它.
它似乎是在调试模式下运行Python应用程序的完美机制.但是看看django,twisted和zope等几个Python项目,assert几乎从未使用过.那么,为什么会这样呢?
为什么在Python社区中不经常使用断言语句?
Fer*_*yer 59
我想assert不经常使用的主要原因是没有人使用Python的"优化"模式.
断言是检测编程错误,保护自己免受意外情况影响的绝佳工具,但所有这些错误检查都需要付出代价.在诸如C/C++之类的编译语言中,这并不重要,因为断言仅在调试版本中启用,并且完全从发布版本中删除.
另一方面,在Python中,调试和发布模式之间没有严格的区别.解释器具有"优化标志"(-O),但目前这实际上并不优化字节代码,而只是删除断言.
因此,大多数Python用户忽略的-O标志和"正常模式",这是他们的运行脚本样的调试模式,因为断言被启用,__debug__是True的,但被认为是"投入生产".
也许切换逻辑是明智的,即默认情况下"优化"并且只在显式调试模式(*)中启用断言,但我想这会让很多用户感到困惑,我怀疑我们会看到这样的改变.
((*)这是Java VM如何通过-ea(启用断言)开关来实现它.)
Joh*_*Mee 32
想到几个原因......
它不是主要功能
许多程序员不要因为基本原理而陷入困境,不尊重任何不是程序倒数第二功能的直接参与者.断言语句用于调试和测试,因此,它们是一种他们负担不起的奢侈品.
单元测试
断言声明早于单元测试的上升和上升.虽然断言语句仍有其用途,但单元测试现在被广泛用于构建恶意环境,用于从子程序及其系统中剔除垃圾.在这些条件下,断言声明开始像枪战中的刀.
提高了行业对测试的尊重
断言声明最适合作为最后一道防线.当这种语言统治世界时,它在C语言下升到了崇高和不可触及的高度,成为实施新的"防御性编程"的好方法; 它在濒临崩溃的那一刻就认识并捕获了灾难性的灾难.这是在测试的价值得到广泛认可和尊重并且灾难更加普遍之前.
今天,如果没有某种形式的测试,任何严肃的商业软件都会被发布,这是闻所未闻的.测试被认真对待并且已经发展成为一个巨大的领域.有测试专业人员和质量保证部门,有大清单和正式签字.在这些条件下,程序员往往不打扰断言,因为他们有信心他们的代码将经受如此多的无聊测试,以至于古怪的灾难条件的可能性非常小,可以忽略不计.这并不是说他们是对的,但如果懒惰编程的责任可以转移到QA部门,那为什么不呢?
Mic*_*att 12
我不是任何这些项目的作者,所以这只是基于我自己的经验猜测.如果没有直接询问这些项目中的人,您将无法获得具体答案.
当您尝试在自己的应用程序中进行调试等时,断言很棒.但是,如您提供的链接中所述,当应用程序可能能够预测并从状态恢复时,使用条件更好.我没有使用过zope,但在Twisted和Django中,他们的应用程序能够从代码中的许多错误中恢复并继续.从某种意义上说,他们已经"编译"了断言,因为他们实际上可以处理它们.
与此相关的另一个原因是,使用外部库(例如您列出的库)的应用程序通常可能需要进行错误处理.如果库只是使用断言,无论错误是什么,它都会引发一个AssertionError.使用条件,库实际上可以抛出可由应用程序捕获和处理的有用错误.
| 归档时间: |
|
| 查看次数: |
11543 次 |
| 最近记录: |