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

Python如何解决mypy --strict下装饰器标注触发Untyped decorator报错

问题原因

你遇到的错误是因为原装饰器的类型标注全部使用了Any,mypy无法感知该装饰器会完整保留被装饰函数的签名与类型信息,因此判定被装饰后的函数变为无类型,触发--strict模式下的检查规则。

解决方案

仅需修改装饰器的类型标注即可,不需要调整其他业务逻辑:

  1. 首先修改导入语句,新增泛型类型定义:
from typing import Dict, Any, List, Callable, TypeVar, ParamSpec
import functools

# 定义泛型参数,用于保留原函数的参数和返回值类型
P = ParamSpec("P")
T = TypeVar("T")

如果你使用的是Python 3.9及更早版本,ParamSpec需要从typing_extensions包导入,执行pip install typing-extensions后将导入语句改为from typing_extensions import ParamSpec即可。

  1. 修改has_params装饰器的类型标注:
def has_params(params: Dict[str, Any]) -> Callable[[Callable[P, T]], Callable[P, T]]:
    def param_decorator(func: Callable[P, T]) -> Callable[P, T]:
        @functools.wraps(func)
        def func_decorator(*args: P.args, **kwargs: P.kwargs) -> T:
            class_obj = args[0]
            for param in params:
                if param not in class_obj.params.keys():
                    raise Exception(f'Parameter {param} not passed to object, but required by function {class_obj.name}.{func.__name__}')
                if not isinstance(class_obj.params[param], params[param]):
                    raise Exception(f'Parameter {param} for object {class_obj.name} has the wrong type, expected {params[param]}, got {type(class_obj.params[param])}')
            return func(*args, **kwargs)
        return func_decorator
    return param_decorator

修改完成后再次执行mypy --strict .就不会再触发该错误,同时被装饰的func1函数的原有类型标注会完全保留,不影响其他逻辑的类型检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:27:01