Python类方法签名使用Union做类型提示时出现mypy语法错误
问题原因
- 未显式导入
Union类型:Python 3.10 之前的版本中,Union不属于内置类型,需要从typing模块导入后才能使用,未导入时mypy无法识别该关键字,会触发类型语法错误。 cls参数类型标注错误:@classmethod的第一个参数是类对象本身,而非类的实例,你标注的"User"代表的是User类的实例类型,不符合类方法参数的类型定义,也可能触发校验报错。
解决方案
- 首先在代码头部添加类型导入语句:
# Python 3.5 ~ 3.9 版本适用 from typing import Union, Optional
如果你使用的是 Python 3.10+ 版本,可以不用导入上述类型,直接使用内置的|语法简化类型标注。
- 修正类方法的参数和返回值标注:
将类方法定义部分修改为以下任意一种写法即可:
- 兼容旧版本的
Optional写法(更简洁,Optional[T]等价于Union[T, None]):
@classmethod async def get_user_by_username( cls: type["User"], username: str ) -> Optional["User"]:
- 保持
Union的写法:
@classmethod async def get_user_by_username( cls: type["User"], username: str ) -> Union["User", None]:
- Python 3.10+ 简化写法:
@classmethod async def get_user_by_username( cls: type["User"], username: str ) -> "User" | None:
- 如果修改后仍然报错,可以尝试升级mypy到最新版本:
pip install --upgrade mypy
补充说明
你__init__方法中的参数标注也存在类型不匹配问题,username: str = None和password: str = None的标注要求参数为字符串类型,但默认值是None,需要同步修改为Optional[str]类型:
def __init__(self, username: Optional[str] = None, password: Optional[str] = None):
内容的提问来源于stack exchange,提问作者esfoobar
相关产品推荐
相关产品推荐

