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
相关产品推荐
相关产品推荐

