You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类方法签名使用Union做类型提示时出现mypy语法错误

问题原因
  • 未显式导入Union类型:Python 3.10 之前的版本中,Union不属于内置类型,需要从typing模块导入后才能使用,未导入时mypy无法识别该关键字,会触发类型语法错误。
  • cls参数类型标注错误:@classmethod的第一个参数是类对象本身,而非类的实例,你标注的"User"代表的是User类的实例类型,不符合类方法参数的类型定义,也可能触发校验报错。
解决方案
  1. 首先在代码头部添加类型导入语句:
# Python 3.5 ~ 3.9 版本适用
from typing import Union, Optional

如果你使用的是 Python 3.10+ 版本,可以不用导入上述类型,直接使用内置的|语法简化类型标注。

  1. 修正类方法的参数和返回值标注:
    将类方法定义部分修改为以下任意一种写法即可:
  • 兼容旧版本的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:
  1. 如果修改后仍然报错,可以尝试升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 17:36:00