pycharm 被装饰过的函数参数提示问题

28 天前
 yuban10703
B = TypeVar("B", bound="Bot")
R = TypeVar("R")
P = ParamSpec("P")

class API(Generic[B, P, R]):
    def __init__(self, func: Callable[Concatenate[B, P], Awaitable[R]]) -> None:
        self.func = func

    def __set_name__(self, owner: Type[B], name: str) -> None:
        self.name = name

    @overload
    def __get__(self, obj: None, objtype: Type[B]) -> "API[B, P, R]": ...

    @overload
    def __get__(
        self, obj: B, objtype: Optional[Type[B]]
    ) -> Callable[P, Awaitable[R]]: ...

    def __get__(
        self, obj: Optional[B], objtype: Optional[Type[B]] = None
    ) -> "API[B, P, R] | Callable[P, Awaitable[R]]":
        if obj is None:
            return self

        return partial(obj.call_api, self.name)  # type: ignore

    async def __call__(self, inst: B, *args: P.args, **kwds: P.kwargs) -> R:
        return await self.func(inst, *args, **kwds)
    

可以参考这个库的代码 https://github.com/nonebot/adapter-dodo/blob/83d55b09a9787c55d06fb01a5bb9c1f2d6a61fde/nonebot/adapters/dodo/utils.py#L39

像下面这个函数 https://github.com/nonebot/adapter-dodo/blob/83d55b09a9787c55d06fb01a5bb9c1f2d6a61fde/nonebot/adapters/dodo/bot.py#L298

被上面这个装饰器装饰过后就没有参数提示了... 在不换 IDE 的情况下该怎么做😭😭😭

994 次点击
所在节点    Python
3 条回复
so1n
28 天前
好像只有 vscode 的才支持
Maerd
27 天前
这不是装饰器的问题,pycharm 对装饰器协议支持还是蛮好的,但是对__get__这类的描述器协议就无力支持了,这两年 pylance 要比 pycharm 的语言服务器显著好用
yuban10703
27 天前
@Maerd pycharm 无解了么🤔

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1066838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX