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

使用mypy检测fractions库时出现_RATIONAL_FORMAT属性错误

解决mypy检测fractions._RATIONAL_FORMAT属性不存在的问题

问题说明

用mypy扫描依赖fractions._RATIONAL_FORMAT的代码时,一直报这个错误:

error: Module "fractions" has no attribute "_RATIONAL_FORMAT"  [attr-defined]

但实际上_RATIONAL_FORMAT是fractions模块里的私有属性,是编译好的正则表达式(re.Pattern),Python运行时用getattr能正常拿到。试过改别名导入、在配置里开implicit_reexport = true,都没解决。

当前环境参数:

  • mypy版本:1.9.0
  • Python版本:3.11.2
  • 项目里的mypy配置(pyproject.toml):
[tool.mypy]
python_version = 3.12
mypy_path = "src"
namespace_packages = true
disallow_incomplete_defs = true
disallow_untyped_defs = true
disallow_untyped_decorators = true
exclude = "version.py"
explicit_package_bases = true
follow_imports = "silent"
ignore_missing_imports = true
implicit_reexport = true

几个实用的解决办法

1. 局部跳过类型检查

在用到_RATIONAL_FORMAT的代码行后面加# type: ignore[attr-defined]注释,直接让mypy忽略这个错误:

# 直接导入时
from fractions import _RATIONAL_FORMAT  # type: ignore[attr-defined]

# 用getattr获取时
import fractions
rational_format = getattr(fractions, "_RATIONAL_FORMAT")  # type: ignore[attr-defined]

这种方法最快,适合临时解决单个地方的问题。

2. 给fractions加自定义类型stub

自己写个类型stub文件补全这个属性的定义,让mypy能识别它:

  1. 在项目根目录下新建types/fractions文件夹
  2. 在里面创建__init__.pyi文件,内容写:
from re import Pattern

_RATIONAL_FORMAT: Pattern[str]
  1. 把types目录加到mypy的路径里,修改pyproject.toml的配置:
[tool.mypy]
# 其他配置不变
mypy_path = "src, types"

这样mypy会加载你写的stub,就不会再报错了。

3. 放宽mypy的检查严格性

如果项目允许,可以在mypy配置里加allow_redefinition = true,让mypy允许属性重定义:

[tool.mypy]
# 其他配置不变
allow_redefinition = true

不过这个选项会降低整体的类型检查严格程度,要不要开得看项目的需求。


内容的提问来源于stack exchange,提问作者srm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:54:51