DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

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 注解错误都按同一条注释改写处理。