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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:12:38