Python如何解决mypy --strict下装饰器标注触发Untyped decorator报错
问题原因
你遇到的错误是因为原装饰器的类型标注全部使用了Any,mypy无法感知该装饰器会完整保留被装饰函数的签名与类型信息,因此判定被装饰后的函数变为无类型,触发--strict模式下的检查规则。
解决方案
仅需修改装饰器的类型标注即可,不需要调整其他业务逻辑:
- 首先修改导入语句,新增泛型类型定义:
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即可。
- 修改
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
相关产品推荐
相关产品推荐

