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