Python中assert的用途

Python中assert的用途

技术背景

assert 语句几乎存在于每一种编程语言中。在 Python 里,assert 主要作为调试辅助工具,用于对代码进行内部自检,能帮助开发者在程序运行早期明确原因的情况下检测出问题,而非在后续因其他操作引发副作用时才发现。其核心作用是确保程序内部状态符合开发者预期,从而捕获潜在的错误。

实现步骤

基本使用

assert 语句的基本形式为 assert condition ,当 conditionFalse 时,会立即触发 AssertionError 。例如:

1
2
assert True  # 无任何反应
assert False # 触发 AssertionError

携带错误信息

可以为 assert 语句添加可选的错误信息,格式为 assert condition, "error message" 。当条件不满足时,会抛出包含该错误信息的 AssertionError 。示例如下:

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

禁用断言

在 Python 中,使用 -O-OO 标志运行解释器,或者设置 PYTHONOPTIMIZE 环境变量,可禁用 assert 语句。例如:

1
python -O script.py

核心代码

基本形式的等价代码

1
2
3
4
# assert condition 等价于
if __debug__:
if not condition:
raise AssertionError

携带错误信息形式的等价代码

1
2
3
4
# assert condition, message 等价于
if __debug__:
if not condition:
raise AssertionError(message)

示例代码

1
2
3
4
5
6
7
8
9
10
11
# 检查输入是否为正数
def get_positive_number():
num = int(input('Enter a positive number: '))
assert num > 0, 'Only positive numbers are allowed!'
return num

# 计算折扣后的价格
def calculate_discount(price, discount):
discounted_price = price - (discount * price)
assert 0 <= discounted_price <= price, "Discounted prices cannot be lower than 0 and they cannot be higher than the original price."
return discounted_price

最佳实践

用于检查函数的前置条件和后置条件

在函数开始处检查输入参数是否符合要求(前置条件),在函数结束处检查返回值是否满足预期(后置条件)。例如:

1
2
3
4
5
def divide(a, b):
assert b != 0, "除数不能为零" # 前置条件
result = a / b
assert isinstance(result, (int, float)), "返回值必须为数字类型" # 后置条件
return result

文档化代码假设

通过 assert 语句可以记录对代码状态的假设,使其他开发者更容易理解代码。例如:

1
2
3
4
def process_list(lst):
assert isinstance(lst, list), "输入必须是列表"
# 处理列表的代码
return lst

常见问题

误将 assert 当作函数调用

assert 是一个语句,而非函数,不能使用括号将条件和信息括起来。例如,assert (condition, "error message") 是错误的用法,这种写法永远不会失败,因为非空元组在布尔上下文中会被视为 True

过度依赖 assert 进行数据验证

由于 assert 语句可以在 Python 初始化时通过 -O-OO 标志关闭,因此不能依赖它来执行数据处理或数据验证,否则可能会导致安全问题。对于用户输入验证,建议使用 raise 语句抛出特定的异常。例如:

1
2
3
4
def validate_user_input(user_input):
if not isinstance(user_input, int):
raise ValueError("输入必须是整数")
return user_input

性能问题

在某些情况下,大量使用 assert 语句可能会影响程序的性能。不过,在生产环境中可以通过禁用 assert 语句来避免这一问题。


Python中assert的用途
https://119291.xyz/posts/python-assert-usage/
作者
ww
发布于
2025年6月17日
许可协议