assert(x < 5, f"Error: x is not smaller than 5")
神奇的是,assert根本不按我设想的工作,无论x的值是多少,上面这代码永远都是顺利通过。一通调研,发现踩了一个经典的Python陷阱:assert在Python中是语句(statement),而非函数(function)。因此,上面这行代码正确的写法应该为:assert x < 5, f"Error: x is not smaller than 5"
(x < 5, f"Error: x is smaller than 5")
视为一个tuple,因此对于assert而言,它的值永远都是True。在 Python 中,语句(statement)是 Python 解释器可以执行的单个逻辑指令或动作。语句不会产生可在表达式中使用的值。这与函数调用不同。
什么是表达式?计算结果为某个值的程序表达,例如:x + 5、len(list)、3 > 2。
什么是语句(statement)?执行某个操作但不产生值的指令,例如:print()、if、for、assert等等。
最后,用几个自我回答的问题帮助每一个Python程序员简单判断究竟某个程序表达是语句还是表达式:
1. 该指令是否控制程序流程,例如if, for, while, try等?如果是,那么这指令是语句。
2. 该指令是否进行了目标定义,例如def, class, import等?如果是,那么这指令是语句。
3. 该指令是否进行赋值操作,例如=, +=, -=等?如果是,那么这指令是语句。
4. 该指令是否进行求值操作?如果是,那么这指令是表达式。
Python这语言,魔鬼在细节里。The devil is in details.