返回None还是空集合?防御式编程的关键细节

我们来做一个假设,假设你有一个函数用于查找数据库中的某个集合结果,当查不到数据时,应该返回什么?

错误用法:

复制代码
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
相关推荐
哥不想学算法4 小时前
【C++】字符串字面量拼接
开发语言·c++
hhzz5 小时前
Python大数据实战(十六):音乐推荐系统——基于协同过滤算法构建个性化歌单引擎
大数据·人工智能·python·数据挖掘·数据分析
SunnyDays10116 小时前
Python PDF 转 Markdown 详解(转换整个文档,特定页面,表格,扫描 PDF)
python·pdf 转 markdown·pdf 转 md·扫描 pdf 转 md·pdf 表格转 md
gugucoding6 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
2601_954706496 小时前
云手机 API 自动化实战:Python 批量控机、挂机脚本完整实现
python·智能手机·自动化
Brookty6 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
F20226974867 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding7 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
万联WANFLOW8 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php