如何解决Pycharm对Asgiref的sync_to_async返回值的类型误告警问题
问题解决最简方案
方案1:单函数快速适配(无需修改导入)
如果只有少量被sync_to_async装饰的函数,直接给被装饰后的函数显式标注类型即可:
from typing import Awaitable, Callable @sync_to_async def get_point(...) -> Point: ... # 新增一行显式声明装饰后的函数类型 get_point: Callable[..., Awaitable[Point]] = get_point async def other_func(): point = await get_point()
添加注解后Pycharm会正确识别get_point返回的是可等待的Point类型协程,不会再抛出类型错误。
方案2:全局适配(一次修改全项目生效)
如果项目内有大量被sync_to_async装饰的函数,可以自定义一个带泛型的包装函数替换原有导入:
from typing import TypeVar, Callable, Awaitable from asgiref.sync import sync_to_async as original_sync_to_async T = TypeVar("T") def sync_to_async(func: Callable[..., T]) -> Callable[..., Awaitable[T]]: return original_sync_to_async(func)
将项目中所有from asgiref.sync import sync_to_async的导入语句,替换为导入上述自定义的sync_to_async即可,无需再给单个函数逐个加类型注解。
补充说明:如果你的项目允许升级依赖,将asgiref升级到3.5.0及以上版本也可以直接解决该问题,该版本官方已经补全了
sync_to_async的泛型类型注解,无需额外修改代码。
内容的提问来源于stack exchange,提问作者lorg
相关产品推荐
相关产品推荐

