使用typeguard时如何解决mypy报装饰器无类型的问题?
解决
@typechecked装饰器导致mypy报错的方案 1. 升级typeguard到最新版本
typeguard 3.0及以上版本已为@typechecked装饰器提供完整类型标注,mypy可直接识别,无需额外配置。执行升级命令:
pip install --upgrade typeguard
升级后重新运行mypy,报错会自动消失。
2. 启用typeguard的mypy插件
若无法升级版本,可通过启用typeguard官方mypy插件,让mypy正确识别@typechecked的类型行为:
- 在项目根目录创建或修改配置文件(
mypy.ini或pyproject.toml) - 添加对应配置:
- 针对
mypy.ini:[mypy] plugins = typeguard.mypy_plugin - 针对
pyproject.toml:[tool.mypy] plugins = ["typeguard.mypy_plugin"]
- 针对
配置完成后,mypy会自动处理@typechecked装饰器的类型推导,不再抛出报错。
3. 手动封装带类型标注的装饰器(备选方案)
若上述方法均不可行,可自行封装带类型标注的装饰器,统一供项目使用以避免重复代码:
- 创建
utils/type_helpers.py文件,内容如下:from typeguard import typechecked as _typechecked from typing import TypeVar, Callable, ParamSpec P = ParamSpec("P") R = TypeVar("R") def typechecked(func: Callable[P, R]) -> Callable[P, R]: return _typechecked(func) - 项目中所有需要类型检查的文件,统一导入该封装后的装饰器:
"""Example python file with a function.""" from utils.type_helpers import typechecked @typechecked def add_two(*, x: int) -> int: """Adds a value to an incoming number.""" return x + 2
此方式既为装饰器添加了正确的类型标注,又避免了在每个文件重复编写类型代码。
内容的提问来源于stack exchange,提问作者a.t.
相关产品推荐
相关产品推荐

