使用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能识别它:
- 在项目根目录下新建
types/fractions文件夹 - 在里面创建
__init__.pyi文件,内容写:
from re import Pattern _RATIONAL_FORMAT: Pattern[str]
- 把
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
相关产品推荐
相关产品推荐

