"assert"在Python中的用途是什么?
注意括号。正如其他回答所指出的,在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)
中,这些只是冗余的括号,它们求值为其内容。但是使用assert(False,)
,括号现在是一个元组,一个非空元组在布尔上下文中求值为True
。
assert
语句存在于几乎所有的编程语言中。它有两个主要用途:
-
它能够在你的程序中尽早检测出问题,确定原因,而不是在其他操作失败后才发现。例如,在Python中,如果没有被尽早捕获,类型错误可能会通过几层代码后才真正引发
Exception
。 -
它作为其他开发人员阅读代码的文档,他们看到
assert
语句可以自信地说从现在开始它的条件成立。
当您执行以下操作时...
assert condition
...您告诉程序测试该条件,并在条件为假时立即触发错误。
在Python中,这大致等同于:
if not condition: raise AssertionError()
在Python shell中尝试一下:
>>> assert True # nothing happens >>> assert False Traceback (most recent call last): File "", line 1, in AssertionError
断言可以包括可选的消息,以及在运行解释器时可以将它们禁用。
要在断言失败时打印消息:
assert False, "Oh no! This assertion failed!"
不要像调用函数一样使用括号调用assert
。它是一个语句。如果你这样做assert(condition, message)
,你将会以一个(condition, message)
元组作为第一个参数来运行assert
。
至于禁用它们,在运行优化模式的python
中,其中__debug__
为False
,assert语句将被忽略。只需传递-O
标志:
python -O script.py
有关相关文档,请参见这里。