Pycharm在执行自动完成/类型检查时使用不完整的存根

时间:2019-08-28 17:23:20

标签: python-3.x pycharm

我正在尝试注释一个变量,该变量包含对asyncio.start_server的调用返回。问题是,Pycharm无法识别AbstractServer类包含的所有方法。

基本示例:

import asyncio as a

async def server():
    svr: a.AbstractServer = await a.start_server(lambda r, w: None, "127.0.0.1", 5555)
    await svr.serve_forever()

此代码有效(当我使用真实的回调并连接客户端时)。 Pycharm抱怨但在await svr.serve_forever()行上显示“弱错误”:

  

类'AbstractServer'的未解析属性引用'serve_forever'

这很奇怪,因为AbstractServer中的events.py肯定包含该方法:

class AbstractServer:
    """Abstract server returned by create_server()."""

    . . .

    async def serve_forever(self):
        """Start accepting connections until the coroutine is cancelled.

        The server is closed when the coroutine is cancelled.
        """
        raise NotImplementedError

    . . .

但是在Pycharm中,当我单击*旁边的边框中的小class AbstractServer以查看存根时,这就是将我重定向到的内容(在events.pyi中):

class AbstractServer:
    sockets: Optional[List[socket]]
    def close(self) -> None: ...
    @coroutine
    def wait_closed(self) -> Generator[Any, None, None]: ...

由于某种原因,存根仅列出了AbstractServer的两个方法和一个属性。因此,即使该类确实具有类似serve_forever的方法,Pycharm似乎也只引用了不完整的存根。

有人知道为什么Pycharm的此类存根不完整以及如何解决吗?我宁愿不必为了避免类型检查器而添加ignore-comments。我尝试了“使缓存无效/重新启动”,但似乎没有任何作用。

1 个答案:

答案 0 :(得分:1)

我不确定这会带来什么影响,但是与此同时,这是我的“解决方案”:

  • 我导航到存根所在的C:\Program Files\JetBrains\PyCharm Community Edition 2019.1.3\helpers\typeshed\stdlib\3

  • 我将/3/asyncio重命名为asyncio_BACKUP(从Pycharm的角度看,实际上是删除了它,而没有实际删除它)。我还可以将events.pyi内的特定3/asyncio/文件重命名,然后其余的都保留下来。

  • 我重新启动了IntelliJ(实际上我运行了“ Invalidate Caches / Restart”,尽管我不确定是否有必要)

现在可以自动完成了。 Pycharm似乎不愿使用events.py而不是使用不完整的events.pyi存根。

我希望有人发布适当的修复程序。同时,这似乎很好。也许我会尝试重新安装Pycharm。尽管这似乎是一个沉重的解决方案。



警告

此解决方案最终效果不佳。如果没有相关的.pyi条目,Pycharm似乎无法加载 ctrl + q 文档。现在,当我尝试加载文档时,它会加载asyncio本身的文档。我打算将文件夹重命名为原来的名称,然后有选择地重命名events.pyi,以限制由此引起的问题。