我正在尝试注释一个变量,其中包含对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">
这很奇怪,因为AbstractServer
inevents.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
以限制这导致的问题。