Python websockets库:哪类可准确代表WebSocket连接及三类差异
关于websockets库中WebSocket连接对象类型的疑问
我在使用Python的websockets库时,遇到了WebSocket连接对象的多种描述方式,不知该如何选择。
文档中启动服务器的示例代码非常简洁:
import asyncio from websockets.asyncio.server import serve async def hello(websocket): name = await websocket.recv() print(f"<<< {name}") greeting = f"Hello {name}!" await websocket.send(greeting) print(f">>> {greeting}") async def main(): async with serve(hello, "localhost", 8765) as server: await server.serve_forever() if __name__ == "__main__": asyncio.run(main())
但直接复制这段代码后,IDE无法识别.recv()和.send()方法。于是我开始查找该WebSocket对象的类型,发现可以使用以下三类:
websockets.ServerConnectionwebsockets.server.ServerConnectionwebsockets.asyncio.server.ServerConnection
我认为它们提供的方法一致,但不确定是否存在显著差异,能否混用?另外文档提到asyncio服务器实现会在客户端连接时创建websockets.asyncio.server.ServerConnection实例,那另外两类的作用是什么?
解答
类型差异与适用场景
这三个ServerConnection本质是同一类的不同导入路径别名,对应websockets库的版本兼容逻辑:
websockets.asyncio.server.ServerConnection:这是当前官方推荐的asyncio运行时专属实现,也是文档中asyncio服务器创建的连接类型,属于最新版本的标准类型。websockets.server.ServerConnection:旧版本的导入路径,为兼容早期代码保留的别名,当前版本中内部会指向asyncio的实现。websockets.ServerConnection:最顶层的简化导入别名,同样是为兼容旧代码存在,最终会映射到当前运行时对应的ServerConnection实现。
能否混用?
三者的核心方法(recv()、send()等)完全一致,运行时混用不会出现逻辑问题。但建议优先使用websockets.asyncio.server.ServerConnection,这是当前版本的标准用法,能解决IDE的类型识别问题,也符合官方文档的最新规范。
IDE方法识别问题的解决
给websocket参数添加明确的类型注解即可让IDE正确识别方法:
import asyncio from websockets.asyncio.server import serve, ServerConnection async def hello(websocket: ServerConnection): name = await websocket.recv() print(f"<<< {name}") greeting = f"Hello {name}!" await websocket.send(greeting) print(f">>> {greeting}") async def main(): async with serve(hello, "localhost", 8765) as server: await server.serve_forever() if __name__ == "__main__": asyncio.run(main())
内容的提问来源于stack exchange,提问作者Himanshu
相关产品推荐
相关产品推荐

