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

Python中是否存在类似C++ [[nodiscard]]的返回值强制使用机制?

Python中是否有类似C++ [[nodiscard]]的机制?

在Python代码中,很容易出现这类隐蔽错误:调用返回新对象的方法时,忘记接收返回值,比如下面的错误写法:

if id:
    query.filter(row.id == id)

而正确的写法应该是将返回的新查询对象重新赋值给变量:

if id:
    query = query.filter(row.id == id)

这类代码语法完全合法,但由于ORM框架(如SQLAlchemy)的filter方法通常返回新的查询实例而非修改原对象,人工排查这类问题非常困难。C++中的[[nodiscard]]属性可以强制要求开发者使用函数返回值,从而避免这类错误,那Python中有没有类似的机制?

已知现状

  • 目前pylint和mypy这两款主流静态分析工具,原生都不支持检测这类“未使用返回值”的问题。
  • Stack Overflow上曾有用户提问“如何让pylint报告未使用的返回值”,寻求解决这类问题的方案。
  • pylint的官方仓库中也有一个未解决的特性请求,要求添加选项来强制检查特定函数/方法的返回值是否被使用。

可行的替代方案

虽然Python标准库没有内置类似[[nodiscard]]的语法,但可以通过以下方式实现类似效果:

  • 自定义装饰器:编写一个装饰器标记需要强制使用返回值的函数/方法,在运行时如果发现返回值未被使用,抛出警告或错误。不过这种方式只能在代码执行时触发,无法做到静态检查;若要实现静态检查,可以结合AST(抽象语法树)分析工具,在代码静态扫描阶段识别未使用返回值的调用。
  • 静态分析工具插件:给pylint或mypy编写自定义插件,针对特定方法(比如ORM的filter)做检查,判断调用后是否有赋值操作。这种方式可以实现静态检查,但需要一定的插件开发能力。
  • 代码规范约束:在团队代码规范中明确要求,对于返回不可变对象或新实例的方法,必须接收其返回值,配合代码Review落地执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:01:18