如何为返回property的装饰器添加正确的类型注解?
解决带参数装饰器返回property的类型注解问题
你的问题出在装饰器的类型注解没有正确关联被装饰函数的返回类型,导致类型检查器无法推断出a.a的实际类型,只能返回Any。要解决这个问题,需要利用Python的泛型类型系统,将被装饰函数的返回类型绑定到最终的property类型上。
以下是修正后的代码:
from typing import TYPE_CHECKING, TypeVar, Callable, Property # 定义泛型变量,代表被装饰函数的返回类型 T = TypeVar('T') def make_prop(param: str) -> Callable[[Callable[[Any], T]], Property[T]]: def wrapper(func: Callable[[Any], T]) -> Property[T]: return property(func) return wrapper class A: @make_prop('foo') def a(self) -> str: return "hello" a = A() assert a.a == "hello" if TYPE_CHECKING: reveal_type(a.a) # 现在会输出: note: Revealed type is "builtins.str"
关键注解说明:
T = TypeVar('T'):定义一个泛型变量,用来捕获被装饰函数的返回类型(这里是str)。make_prop的返回类型Callable[[Callable[[Any], T]], Property[T]]:表示这个装饰器工厂会返回一个装饰器,该装饰器接受一个“实例方法(输入为实例本身,返回类型T)”,并返回一个类型为T的property。wrapper的参数func: Callable[[Any], T]:明确被装饰的函数是一个实例方法,接收实例(Any可以换成更具体的类型,比如A),返回类型为T。wrapper的返回类型Property[T]:明确返回的property的类型是T,和原函数的返回类型保持一致。
这样修改后,类型检查器就能正确推断出a.a的类型是str,而非Any。
内容的提问来源于stack exchange,提问作者user16776498
相关产品推荐
相关产品推荐

