协慌网

登录 贡献 社区

在 Python 中使用 “assert” 有什么用?

我一直在阅读一些源代码,在一些地方我已经看到了assert的用法。

这究竟是什么意思?它的用途是什么?

答案

assert语句几乎存在于每种编程语言中。它有助于在程序的早期发现问题,原因很明显,而不是后来作为其他一些操作的副作用。

当你这样做......

assert condition

... 您告诉程序测试该条件,如果条件为假,则立即触发错误。

在 Python 中,它大致相当于:

if not condition:
    raise AssertionError()

在 Python shell 中尝试:

>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

断言可以包含可选消息,您可以在运行解释器时禁用它们。

要在断言失败时打印消息:

assert False, "Oh no! This assertion failed!"

不要使用括号调用assert像一个功能。这是一份声明。如果你执行assert(condition, message)你将使用(condition, message)元组作为第一个参数运行assert

至于禁用它们,当在优化模式下运行python__debug__False ,断言语句将被忽略。只需传递-O标志:

python -O script.py

请参阅此处获取相关文档。

注意括号。正如上面已经指出的那样, 在 Python 3 中, assert仍然是一个声明 ,所以通过类比print(..) ,可以将它推断为assert(..)raise(..)但你不应该。

这很重要,因为:

assert(2 + 2 == 5, "Houston we've got a problem")

不会有用,不像

assert 2 + 2 == 5, "Houston we've got a problem"

第一个不起作用的原因是bool( (False, "Houston we've got a problem") )评估为True

在语句assert(False) ,这些只是False周围的冗余括号,它们根据其内容进行求值。但是使用assert(False,) ,括号现在是一个元组,并且非空元组在布尔上下文中求值为True

正如其他答案所指出的那样, assert类似于在给定条件不成立时抛出异常。一个重要的区别是,如果使用优化选项编译代码,则会忽略 assert 语句。 文档assert expression可以更好地描述为等同于

if __debug__:
   if not expression: raise AssertionError

如果您想要彻底测试代码,然后在您对所有断言案例都没有失败感到高兴时发布优化版本,这将非常有用 - 当优化开启时, __debug__变量变为 False 且条件将停止进行评估。如果你依赖断言并且没有意识到它们已经消失,这个功能也会让你感到惊讶。