返回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
相关推荐
测试员周周6 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
测试19986 小时前
软件测试 - 单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
曲幽8 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
杜子不疼.8 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号38 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia9 小时前
Qt——编辑交互功能的实现
开发语言·qt
石山代码10 小时前
C++ 内存分区 堆区
java·开发语言·c++
前端若水10 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
无风听海10 小时前
C# 隐式转换深度解析
java·开发语言·c#
涛声依旧-底层原理研究所11 小时前
残差连接与层归一化通俗易懂的详解
人工智能·python·神经网络·transformer