如何让mypy自动忽略使用特定自定义装饰器的类?
解决方案
有几种可行的方法可以让自定义装饰器自动触发mypy忽略类型检查,无需重复添加@typing.no_type_check:
1. 用no_type_check_decorator标记自定义装饰器
给你的turn_into_data装饰器添加@typing.no_type_check_decorator(Python 3.10+内置)或@typing_extensions.no_type_check_decorator(Python 3.9及以下版本),类型检查器会自动对被该装饰器修饰的类禁用类型检查。
示例代码:
from typing import no_type_check_decorator @no_type_check_decorator def turn_into_data(cls): # 装饰器逻辑:提取注解生成目标数据 cls.generated_data = {attr: value for attr, value in cls.__annotations__.items()} return cls # 使用时无需额外添加no_type_check @turn_into_data class Foo: bar: 5 baz: "custom_literal"
这个方案优势是精准控制——仅对被turn_into_data装饰的类生效,不会干扰其他代码的类型检查。
2. 在mypy配置中针对性禁用错误码
mypy对非类型注解的错误会抛出valid-type错误码,你可以在mypy配置文件(如mypy.ini或pyproject.toml)中局部或全局禁用该错误:
全局禁用(不推荐,可能掩盖其他合法错误)
[mypy] disable_error_code = valid-type
仅针对特定模块禁用
[mypy-your_project.data_modules.*] disable_error_code = valid-type
这种方式无需修改代码,但需要维护mypy配置,范围控制精度不如第一种方法。
3. 自定义mypy插件(复杂场景适用)
如果项目有更复杂的类型检查需求,可以编写mypy插件,让它识别turn_into_data装饰器并自动跳过对类注解的类型验证。这种方法开发成本较高,但灵活性最强,适合大规模项目定制规则。
内容的提问来源于stack exchange,提问作者Joseph Garvin
相关产品推荐
相关产品推荐

