【问题标题】: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 打包
- 误导性的混淆尝试