mypy 2.4 拒绝混合 ty 错误码,检查 ignore 注释的冒号解析
mypy 2.4 的错误码词法检查会拒绝 ty: 命名空间。采用允许冒号的解析组件或拆分两种忽略注释,并保留未忽略错误的负例。
项目同时使用 mypy 与 ty,在一条注释里保留两个检查器的错误码,升级 mypy 2.4.0 后却多出 Invalid "type: ignore" comment [syntax],原来要忽略的赋值错误也重新出现。先看完整注释,尤其是错误码中的冒号:
foo: int = "bar" # type: ignore[assignment, ty:invalid-assignment]
这是注释解析阶段的回归。新 ast-serialize 组件验证错误码字符时,只允许字母数字、下划线和连字符;ty: 中的冒号让整条注释被判为无效。于是 mypy 没有取得原本合法的 assignment 忽略项,不能把重新出现的赋值错误理解成忽略范围本来就写错。
正式 ast-serialize 0.12.0 将冒号纳入允许字符,并保留其他词法校验。可以在同一个 mypy 2.4.0 工具环境中选择这份修复:
python -m pip install "mypy==2.4.0" "ast-serialize==0.12.0"
python -c "from importlib.metadata import version; print(version('mypy'), version('ast-serialize'))"
python -m mypy repro.py
原问题使用 Python 3.14,没有列出操作系统与具体组件版本。实际安装仍需符合项目的 Python、平台和依赖约束;编辑器、终端与 CI 使用各自的工具环境时,要分别核对执行入口。
同时留一个不该被忽略的错误
验收文件可以写为:
foo: int = "bar" # type: ignore[assignment, ty:invalid-assignment]
bar: int = "foo"
第一行应不再产生注释 syntax 错误,也不再报告已指定忽略的 assignment;第二行仍应报告普通赋值不兼容。保留这个负例,可以避免把整个文件跳过检查误当成修复成功。
暂时不能调整组件时,可以拆成各检查器自己的形式:
foo: int = "bar" # type: ignore[assignment] # ty: ignore[invalid-assignment]
这种写法让 mypy 的标准忽略列表只包含它需要识别的错误码,ty 使用自己的注释。仍要用项目实际的两个检查器运行验证,尤其是启用了未使用忽略项检查或定制错误码规则的环境。
允许冒号,只表示这条注释可以被正确解析,不会让 mypy 自动理解 ty 的规则语义,也没有取消其他字符限制。每个检查器需要的真实错误码仍要保留;不要为避开 syntax 错误而删掉 assignment,否则第一行的类型错误理应继续报告。
若没有命名空间错误码,仍出现无效注释,应检查括号、分隔符和所用格式。这个字符许可补丁与字符串类型节点的序列化是不同分支,不能将所有 mypy 2.4 注解错误都按同一条注释改写处理。


