Pylance无法显示包装类调用时的参数及文档字符串问题求助
问题分析与修复方案
问题原因
你的Wrapper类的__call__方法用了*args: Any, **kwargs: Any这种宽泛的参数注解,类型检查器(比如Pylance)没法从这里关联到被包装的Action类构造函数的具体参数签名和文档字符串,所以调用wrapped时无法给出对应的智能提示。
修复方案
要让类型检查器识别被包装对象的参数和文档,需要用PEP 612引入的ParamSpec和泛型参数来保留原始可调用对象的参数信息,同时手动传递文档字符串。具体实现如下:
from typing import Any, TypeVar, Generic, Callable, ParamSpec # 如果Python版本低于3.10,替换为下面的导入: # from typing_extensions import ParamSpec # 定义参数规格泛型,捕获被包装对象的所有参数信息 P = ParamSpec("P") ReturnType = TypeVar("ReturnType", bound=Any) class Wrapper(Generic[P, ReturnType]): def __init__(self, callable_: Callable[P, ReturnType]) -> None: self.callable_ = callable_ # 传递被包装对象的文档字符串 self.__doc__ = callable_.__doc__ def __call__(self, *args: P.args, **kwargs: P.kwargs) -> ReturnType: return self.callable_(*args, **kwargs) class Action: def __init__(self, title: str) -> None: """创建一个Action实例,必须传入标题参数""" self.title = title wrapped = Wrapper(Action) # 现在调用wrapped时,Pylance会显示Action.__init__的参数提示和文档字符串 action = wrapped("title")
关键修改说明
ParamSpec("P"):定义参数规格变量,用来精准捕获被包装可调用对象的位置参数、关键字参数信息Callable[P, ReturnType]:明确被包装对象的参数符合P的规格,返回类型为ReturnType__call__方法的*args: P.args, **kwargs: P.kwargs:告诉类型检查器,该方法的参数完全匹配被包装对象的参数,编辑器就能给出准确的参数提示self.__doc__ = callable_.__doc__:让编辑器悬停wrapped时,显示原始可调用对象的文档字符串
修改后,Pylance就能在调用wrapped时正确显示Action.__init__的参数要求和文档了。
内容的提问来源于stack exchange,提问作者eightlay
相关产品推荐
相关产品推荐

