基本上每一种编程语言中都有assert
声明。
总的来说,assert condition
的意义是令程序测试condition,并在condition测试结果为false的时候抛出异常。
在Python中,assert
有两种形式:
-
assert expression
assert expression
等同于如下代码:if _debug_: if not expression: raise AssertionError
-
assert expression1, expression2
assert expression1, expression2
等同于如下代码:if _debug_: if not expression1: raise AssertionError(expression2)
以上两段代码中的_debug_
和AssertionError
都代表的是Python中内建的变量。当前Python中_debug_
在普通情况下均为True
。只有当程序执行在优化模式下为False
(优化模式为命令行的-O
选项)。所以当程序以优化模式编译后,assert
声明并不会被执行。需要注意的是,我们并不需要手动在错误信息中加入assert
后被检测的expression
的代码,这些代码会自动显示在出错的堆栈信息中。
另外,给_debug_
赋值是非法的。_debug_
的值在程序的编译器开始工作时就已经确定了。
我们可以通过以下这个简单的python shell中的例子来理解assert
。
>>> assert True
# Nothing happens
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
-
一点注意事项
assert
与print
是不同的。print()
可以正常工作,但assert()
是错误的。这是因为print()
是一个python内建方法而assert()
不是。看如下例子:assert(2 + 2 == 5, "Oops something went wrong.")
是错误的。assert 2 + 2 == 5, "Oops something went wrong."
是正确的。其中第一条代码错误的原因是:根据
assert
的意义,程序将会检测assert
后面的expression
的值,也就是bol((2 + 2 == 5, "Oops something went wrong."))
。而Python中一个非空元组的布尔值是True
。再比如
assert(False)
。当()
出现在assert
后面时,Python编译器会认为assert
后面的输入是一个元组。而一个非空元组的布尔值总为True
。因此assert()
并不能正常工作。
网友评论