Pyright对attrs官方示例代码报reportAttributeAccessIssue的解决办法
问题描述
环境
- Python v3.9.13
- Pyright 1.1.357
- attrs 23.1.0
attrs官方文档中的示例代码,在Pyright进行类型检查时会触发reportAttributeAccessIssue错误。
代码示例
from attrs import define, field @define class C: x: int = field() @x.validator def _check_x(self, attribute, value): if value > 42: raise ValueError("x必须小于等于42")
Pyright检查结果
qwer.py:8:8 - error: Cannot access member "validator" for type "int" Member "validator" is unknown (reportAttributeAccessIssue) 1 error, 0 warnings, 0 informations
除了忽略该问题外,还有哪些可行的解决方式?
可行解决方式
1. 直接通过field的validator参数绑定验证函数
这是最适配Pyright类型检查的写法,绕开字段属性绑定验证器的语法:
from attrs import define, field def _check_x(self, attribute, value): if value > 42: raise ValueError("x必须小于等于42") @define class C: x: int = field(validator=_check_x)
2. 给字段添加Field类型注释
明确标注字段是attrs.Field类型,让Pyright识别它不是普通的int:
from attrs import define, field, Field @define class C: x: Field[int] = field() @x.validator def _check_x(self, attribute, value): if value > 42: raise ValueError("x必须小于等于42")
如果你的attrs版本不支持泛型Field[int],可以用int | Field替代。
3. 使用attrs内置验证器
如果验证逻辑能匹配内置验证器,直接使用更简洁且不会触发类型错误:
from attrs import define, field from attrs.validators import le @define class C: x: int = field(validator=le(42))
这里le(42)表示验证值小于等于42,和示例逻辑完全一致。
4. 启用attrs的Pyright插件
attrs官方提供了专门的Pyright插件,能正确识别文档中的装饰器语法:
- 安装插件:
pip install attrs-pyright - 在项目根目录创建
pyrightconfig.json,添加配置:
{ "plugins": ["attrs-pyright"] }
内容的提问来源于stack exchange,提问作者usan
相关产品推荐
相关产品推荐

