使用timedelta扩展datetime时mypy报类型不兼容错误的解决方法
解决mypy类型不匹配问题
错误原因
你遇到的mypy错误是因为self.token_exp初始被赋值为int类型的0,但后续在token_expiration方法中又给它赋值datetime类型的对象,类型不一致导致静态检查失败。
解决方案
有两种可行的修正方式:
方式一:显式标注可选类型
如果需要token_exp初始处于未设置状态,可以用Optional[datetime]标注类型,初始值设为None:
from datetime import datetime, timedelta from typing import Optional class TokenExp: LIFETIME = 60 def __init__(self, lifetime_in_minutes: int = LIFETIME) -> None: self.lifetime = timedelta(minutes=lifetime_in_minutes) self.token_exp: Optional[datetime] = None # 明确类型为可选datetime def token_expiration(self) -> datetime: now = datetime.utcnow() self.token_exp = now + self.lifetime return self.token_exp
方式二:初始化时直接设置datetime类型值
如果希望token_exp从实例创建时就有有效值,可以在__init__中直接计算初始过期时间:
from datetime import datetime, timedelta class TokenExp: LIFETIME = 60 def __init__(self, lifetime_in_minutes: int = LIFETIME) -> None: self.lifetime = timedelta(minutes=lifetime_in_minutes) self.token_exp = datetime.utcnow() + self.lifetime # 初始即为datetime类型 def token_expiration(self) -> datetime: self.token_exp = datetime.utcnow() + self.lifetime return self.token_exp
这两种方式都能让mypy识别到self.token_exp的正确类型,消除类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Italo Lemos
相关产品推荐
相关产品推荐

