我们来做一个假设,假设你有一个函数用于查找数据库中的某个集合结果,当查不到数据时,应该返回什么?
错误用法:
def get_users(department):
# 查不到返回 None
if department == "财务":
return None
return ["张三", "李四"]
正确用法:
def get_users(department):
if department == "财务":
return []
return ["张三", "李四"]
返回 [](空集合)而不是 None 能确保调用者在不判断的情况下直接使用:
for user in get_users("财务"):
print(user) # 不会报错
这在写 API SDK、数据接口、中间层函数时尤其重要。减少调用方的防御代码,是良好接口设计的关键。

可能有朋友要问:为什么空集合更好?有以下几个大致的原因:
- 遵循最小意外原则:空集合是合法的可迭代对象
- 避免 NoneType 错误:最常见的 Python 运行时错误之一
- 简化调用逻辑:无需前置判空检查
- 类型一致性:保持返回类型稳定(list → list)
那么何时该返回 None?通常在下面三种情况下:
- 操作失败且无合理默认值时
- 需要区分"无结果"和"错误"时
- 函数名暗示可能返回 None