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()行上显示"弱错误":

类"抽象服务器"的未解析属性引用"serve_forever">

这很奇怪,因为AbstractServerinevents.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 的这个类的存根不完整以及如何修复它?我宁愿不需要添加忽略注释只是为了绕过类型检查器。我尝试了"使缓存无效/重新启动",但这似乎没有任何作用。

我不确定这样做会有什么影响,但这是我在此期间的"修复":

  • 我导航到C:Program FilesJetBrainsPyCharm Community Edition 2019.1.3helperstypeshedstdlib3,这是存根所在的位置

  • 我将/3/asyncio重命名为asyncio_BACKUP(基本上是从Pycharm的角度删除它,而没有实际删除它(。我也可以重命名3/asyncio/中的特定events.pyi文件,其余的则不理会。

  • 重新启动了IntelliJ(实际上我运行了"使缓存无效/重新启动",尽管我不确定这是否必要(

它现在可以自动完成。Pycharm似乎已经退回到使用events.py而不是使用不完整的events.pyi存根。

我希望有人发布适当的修复程序。不过,在此期间这似乎很好。也许我会尝试重新安装 Pycharm;虽然这似乎是一个沉重的修复。



警告

这个解决方案最终很差。Pycharm 似乎无法在没有关联.pyi条目的情况下加载任何内容的ctrl+q文档。现在,当我尝试加载文档时,它会加载asyncio本身的文档。我将把文件夹重命名回原来的样子,并有选择地重命名events.pyi以限制这导致的问题。

最新更新