为什么断言没有被大量使用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

我发现Python断言语句是一个很好的方法来捕捉不应该发生。而且,当代码被信任为正确时,Python优化可以将其删除。

它似乎是在调试模式下运行Python应用程序的完美机制。但是看看几个Python项目,比如Django、twid和Zope,assert几乎从未被使用过。为什么会发生这种事?

为什么断言语句在Python社区中不经常使用?

提问于
用户回答回答于

我想主要原因是assert不经常使用是因为没有人使用Python的“优化”模式

断言是一个很好的工具,可以检测编程错误,防止意外情况发生,但所有这些错误检查都需要付出代价。在C/C++等编译语言中,这并不重要,因为断言只在调试版本中启用,并且从发布版本中完全删除。

另一方面,在Python中,对调试释放解释器具有“优化标志”(-O),但目前这并不是真正优化字节码,而是只删除断言。

因此,大多数Python用户只是忽略了-O标记并以“正常模式”运行脚本,这是有点自断言启用以来的调试模式,并且__debug__True,但被认为是“准备好的生产”。

也许更明智的做法是切换逻辑,即默认情况下进行“优化”,并且只在显式调试模式下启用断言(*),但我想这会使许多用户感到困惑,我怀疑我们是否会看到这样的变化。

((*)例如,JavaVM是如何做到这一点的,它提供了一个-ea(启用断言)切换。)

用户回答回答于

我想到了几个原因

它不是一个主要的功能。

许多程序员,让他们不要被理由所困扰,不尊重任何不是程序倒数第二功能的直接参与者。ASSERT语句是用于调试和测试的,因此,这是一种他们负担不起的奢侈。

单元测试

ASSERT语句早于单元测试的兴起和兴起,虽然ASSERT语句仍然有它的用途,但是单元测试现在被广泛用于构建一个敌对的环境,用它来打击子程序和系统中的垃圾。在这种情况下,断言声明开始感觉像枪战中的刀子。

改进行业对测试的尊重

断言语句是最后一道防线。当C语言统治世界时,它上升到了一个高不可攀的高度,这是实现新的、尖尖的“防御性编程”的一种很好的方式;它在灾难摇摇欲坠的时刻意识到并诱捕了灾难。这是在试验的价值得到广泛承认和尊重以及灾害大大增加之前。

今天,它是闻所未闻的,任何严肃的商业软件发布,没有某种形式的测试。测试被认真对待,并且已经发展成为一个巨大的领域。有一些测试专业人员和质量保证部门拥有庞大的核对表和正式的签约。在这种情况下,程序员往往不去理会断言,因为他们有信心自己的代码会受到如此多令人厌烦的测试,以至于古怪的濒临灾难的情况发生的可能性微乎其微,几乎可以忽略不计。这并不是说他们是对的,但是如果懒惰编程的责任可以转移到QA部门,那为什么不呢?

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励