【问题标题】:Why does python enable assertions by default为什么python默认启用断言
【发布时间】:2020-03-19 07:15:22
【问题描述】:

我一直在阅读一些关于 python 和其他语言的断言语句的内容。 特别是,我已经阅读了 Python、Java 和 C 中的断言。我的理解可能不是 100% 正确,但接下来的问题是关于 Python。

在 Python 的情况下,为什么默认启用断言? 为什么 python 这样做与其他语言不同?** 是否有特定的原因 - 编译时间与解释时间 - 对于它?

  • 在 Java 中,除非明确启用,否则默认情况下禁用断言。
  • 在 C 和 C++ 中,使用来自 assert.h 的断言的程序默认情况下不会禁用它们,但大多数 Makefile 确实为发布/分发定义了 NDEBUG
    • CMake 默认为dist 设置 NDEBUG
    • 许多项目定义了自己的 assert 宏而不是使用 assert.h 并更改默认行为。

我知道我的问题是在询问一些历史背景,但这实际上是我正在寻找的答案。

旁注: 我也是 python 新手,在我工作的地方,我们不会在启用优化标志的情况下在生产中运行 任何 代码。这是部署 python 应用程序时的常见做法吗?

如果你有兴趣,下面是我读过的资料:

【问题讨论】:

  • 默认捕获错误?捕捉错误很方便。

标签: python assert language-design


【解决方案1】:

我的猜测是由于性能原因,断言在 Java、C 和 C++ 中被禁用。断言使代码变慢,也可能使某些代码优化变得不可能。这些语言将速度作为重中之重,因此默认禁用它们是有意义的。

另一方面,Python 不太关心速度。看看Python Zen

Errors should never pass silently.
Unless explicitly silenced.

断言引发AssertionError,所以最好不要默默地传递它们。

【讨论】:

    【解决方案2】:

    在 Python 的情况下,为什么默认启用断言?为什么 python 这样做与其他语言不同?** 是否有一个特殊的原因 - 编译时间与解释 - 对于它?

    因为一般来说没有理由不这样做。 Python 不是一门快速的语言,拥有看起来像它应该默认做的事情但没有做的代码是奇怪的。顺便说一句,这正在传播到更多的语言,例如Rust 有一个 始终运行assert! 宏,以及一个仅在调试模式下运行的单独的 debug_assert!

    非 xunit 测试包(如 pytest)也利用了此属性,它们使用和重写断言以使它们更好(更方便且约束更少)assert* 方法。

    旁注:我也是 python 新手,在我工作的地方,我们不会在启用优化标志的情况下在生产中运行任何代码。这是部署 python 应用程序时的常见做法吗?

    如果您要问运行 pyhton -O 是否常见,那么是的。 -O 做的有用的东西相对较少:我认为我从未见过使用 __DEBUG__ 并绕过 assert 的代码库总是让人感到恶心。而-OO基本上只会做负面的事情。

    我见过的唯一经常使用-O / -OO 的案例是:

    • 看起来确实是半频繁的 Windows 打包
    • 误导性的混淆尝试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2019-04-25
      • 2010-11-24
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多