断言

断言(assertion) 是一种 自我检查机制,用于判断程序运行时某个条件是否为真。
当条件为假时,程序会抛出异常(AssertionError)并终止执行,以提示你“程序状态不符合预期”。

简单说:

“我确信这里必须是 True,否则说明有 bug。”

语法结构

1
assert 条件, 错误提示(可选)

📘 举例:

1
2
3
x = 10
assert x > 0, "x 必须是正数"
print("继续执行...")

✅ 输出:

1
继续执行...

❌ 若条件不成立:

1
2
x = -5
assert x > 0, "x 必须是正数"

报错:

1
AssertionError: x 必须是正数

执行原理

assert 的本质相当于:

1
2
if not 条件:
raise AssertionError(错误提示)

也就是说,断言会在条件为 False 时自动抛出异常。

例如:

1
2
3
4
5
# 以下两者等价
assert x > 0, "x 必须大于 0"

if not x > 0:
raise AssertionError("x 必须大于 0")

典型用途

检查函数输入参数是否合法

1
2
3
4
5
6
def divide(a, b):
assert b != 0, "除数不能为 0"
return a / b

print(divide(10, 2)) # ✅ 5.0
print(divide(10, 0)) # ❌ AssertionError: 除数不能为 0

检查数据处理中的中间结果

1
2
3
data = [1, 2, 3]
total = sum(data)
assert total > 0, "总和必须为正数"

验证算法假设或逻辑不变量

在算法或状态机中,断言用于确保某些逻辑在运行中永远成立:

1
2
3
def move_player(x, y):
assert 0 <= x <= 100 and 0 <= y <= 100, "坐标越界!"
return (x, y)

单元测试中快速验证

在轻量级测试脚本中,断言可以替代测试框架:

1
2
3
4
def test_sum():
assert sum([1, 2, 3]) == 6
assert sum([]) == 0
assert sum([-1, 1]) == 0

运行时若一切正常,不输出任何信息;否则报错提示问题所在。

与异常的关系

区别点 assert raise
目的 调试时验证假设 主动抛出异常
抛出异常类型 AssertionError 任意类型(如 ValueError, TypeError
常用于 开发阶段的内部检查 逻辑错误或用户输入错误
可禁用 ✅ 可被优化关闭 ❌ 永远生效

关闭机制

Python 在优化模式(使用命令行参数 -O)运行时,会自动移除所有 assert 语句

例如:

1
python -O my_script.py

此时程序中的所有断言不会执行,相当于全部被删掉。

👉 因此:

  • 断言不能用于程序的业务逻辑检查,例如输入验证或权限校验。
  • 它只适合开发与调试阶段内部逻辑验证

最佳实践

推荐

  • 用来检测你认为“不可能出错”的条件;
  • 用来验证内部逻辑一致性;
  • 用来在开发时快速定位 bug。

避免

  • 不要用于业务逻辑错误检测;
  • 不要用于外部输入校验;
  • 不要用于替代异常处理机制。

进阶示例

多条件断言

1
2
3
4
def process_user(age, name):
assert isinstance(age, int) and age > 0, "年龄必须是正整数"
assert isinstance(name, str) and len(name) > 0, "姓名不能为空"
print(f"欢迎 {name}, 年龄 {age}")

调试复杂逻辑

1
2
3
4
5
def compute(a, b):
result = a ** 2 - b ** 2
# 确保计算结果非负
assert result >= 0, f"计算错误:result={result} 小于 0"
return result

与 try-except 搭配

1
2
3
4
try:
assert 2 + 2 == 5, "数学炸了"
except AssertionError as e:
print("断言失败:", e)

输出:

1
断言失败: 数学炸了

总结表格

要点 内容
关键字 assert 条件, "错误信息"
本质 条件不满足 → 抛出 AssertionError
场景 调试、验证逻辑、测试
禁用 运行时使用 python -O
不适合 用户输入验证、生产逻辑判断
等价语句 if not 条件: raise AssertionError(...)