使用attrs与pre-commit时mypy报Unexpected keyword argument错误
终端mypy正常但pre-commit阶段报Unexpected keyword argument错误
问题场景
直接在终端运行mypy时一切正常,但通过pre-commit执行mypy检查时,类的所有属性都会触发Unexpected keyword argument错误。
相关代码
from attrs import define, field from typing import Any @define( frozen=True, kw_only=True, slots=True, auto_detect=True, order=False, auto_attribs=True, ) class MyClass: a: str = field(default="") b: str = field(default="") def myMethod(self) -> Any: return MyClass(a=self.a, b="b_value")
pre-commit配置
- repo: https://github.com/pre-commit/mirrors-mypy rev: v1.11.2 hooks: - id: mypy args: ["--config-file", "mypy.ini"]
报错信息
error: Unexpected keyword argument "a" for MyClass (line: return MyClass...)
error: Unexpected keyword argument "b" for MyClass (line: return MyClass...)
解决方案
这是因为pre-commit的mypy镜像默认在隔离环境中运行,没有安装项目依赖(比如attrs),导致mypy无法识别attrs生成的类构造函数参数。有两种解决方法:
方法一:给钩子添加项目依赖
在pre-commit配置的mypy钩子中,通过additional_dependencies指定需要的包版本,确保隔离环境安装了attrs:
- repo: https://github.com/pre-commit/mirrors-mypy rev: v1.11.2 hooks: - id: mypy args: ["--config-file", "mypy.ini"] additional_dependencies: ["attrs>=23.0.0"]
注意替换成你项目实际使用的attrs版本。
方法二:使用系统环境运行mypy
让pre-commit调用你终端中已安装好所有依赖的mypy,只需在钩子中添加language: system:
- repo: https://github.com/pre-commit/mirrors-mypy rev: v1.11.2 hooks: - id: mypy args: ["--config-file", "mypy.ini"] language: system
注意事项
如果用方法一,要保证additional_dependencies里的包版本和项目依赖一致,避免类型检查结果出现差异。
内容的提问来源于stack exchange,提问作者Sebastian Souza Tarnowski
相关产品推荐
相关产品推荐

