Python为什么默认启用断言

问题描述 投票:1回答:2

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

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

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

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

旁注:我也是python的新手,在我工作的地方,我们没有在启用优化标志的生产环境中运行any代码。部署python应用程序时,这是惯例吗?

[如果您有兴趣,那么以下是我阅读的资源:

python assert language-design
2个回答
2
投票

我的猜测是,由于性能原因,在Java,C和C ++中禁用了断言。断言使代码变慢,并且可能使某些代码优化变得不可能。这些语言将速度作为头等大事,因此默认情况下禁用它们是有意义的。

另一方面,Python与速度无关。看看Python Zen

Errors should never pass silently.
Unless explicitly silenced.

断言引发AssertionError,所以最好不要静默通过它们。


1
投票

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

因为通常来说没有理由不这样做。 Python不是一种快速的语言,拥有看起来像它的代码在默认情况下应该可以执行操作,但并非奇怪。顺便说一句,这正在蔓延到更多的语言,例如Rust具有一个[[始终运行 assert!宏和一个仅在调试模式下运行的单独的debug_assert!

[诸如pytest之类的非xunit测试程序包也利用了此属性,这些程序包使用和重写断言以使其变得更好(更方便且约束更少)assert*方法。

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

如果您问是否运行pyhton

-O很常见,那么可以。 -O几乎没有什么用处:我认为我从未见过使用__DEBUG__的代码库,而绕过assert总是很讨厌。 -OO基本上只做负面的事情。我所见的唯一例行使用-O / -OO的情况是:

    看起来不太常见的Windows包装
  • 误入歧途的尝试
© www.soinside.com 2019 - 2024. All rights reserved.