You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python函数中分别检测参数未传递、空列表及非列表类型

函数参数校验的实践问题

问题背景

我定义了如下Python函数:

def fun(keywords: list[str] = None):

需要分别检测以下三种情况:

  • keywords参数未被传递(即使用默认值None)
  • keywords是一个空列表
  • keywords不是列表类型

我尝试了以下校验代码:

if not keywords:
        raise ValueError("not passed")
    if not isinstance(keywords, list):
        raise TypeError("keywords must be an list")
    if isinstance(keywords, list) and (not bool(len(keywords))):
        raise ValueError("empty list passed")

但第一个if语句会同时触发情况1和情况2,导致后续检测空列表的代码无法执行。请问将第一个条件改为如下写法是否属于良好实践?

if not keywords and keywords != []:
        raise ValueError("not passed")

回答

你这种写法不算良好实践,主要有两个问题:

  • 逻辑不够直观:not keywords已经包含None的判断,额外加keywords != []虽然能区分空列表,但写法冗余,可读性差。
  • 校验顺序不合理:应该优先做类型检查,再做值的校验,避免后续逻辑因类型错误出问题。

更合理的校验写法应该调整顺序,清晰区分三种情况:

def fun(keywords: list[str] = None):
    # 先判断是否未传递参数(使用默认None)
    if keywords is None:
        raise ValueError("keywords is not passed")
    # 再验证参数类型是否合法
    if not isinstance(keywords, list):
        raise TypeError("keywords must be a list")
    # 最后检查列表是否为空
    if not keywords:
        raise ValueError("empty list passed")

这种写法的优势:

  • 逻辑清晰,每一步只做单一判断,不会出现条件覆盖的问题
  • 顺序合理:先确认参数是否存在,再校验类型,最后检查内容,符合常规的参数校验流程
  • 可读性强,维护成本低

内容的提问来源于stack exchange,提问作者zaelcovsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:42:36