mypy报类型不兼容赋值错误,请求排查与修复方案
解答
这确实是mypy的预期行为,它的静态类型检查会严格跟踪变量的类型变化——你在这里复用了_check_in这个变量名,但前后给它赋予了完全不同的类型:
- 第一次赋值
_check_in = check_in.strftime("%Y-%m-%d")后,变量类型是str - 第二次赋值
_check_in = _check_in.split("-")时,split()返回的是List[str],和之前的str类型冲突,所以mypy会抛出类型不兼容的错误。
如果重命名变量后问题依旧,大概率是你没彻底把所有冲突的变量名都改掉?不过不管怎样,有两种清晰的解决思路:
方案1:使用不同变量名,避免类型覆盖
最直接的方式就是给不同阶段的结果用不同的变量名,让类型跟踪更清晰:
import datetime def create_url(check_in: datetime.date) -> str: """take date such as '2018-06-05' and transform to format '06%2F05%2F2018'""" date_str = check_in.strftime("%Y-%m-%d") date_parts = date_str.split("-") formatted_arrival = f"{date_parts[1]}%2F{date_parts[2]}%2F{date_parts[0]}" return f"https://www.website.com/?arrival={formatted_arrival}"
方案2:直接用strftime生成目标格式(更推荐)
其实你完全不需要先转成YYYY-MM-DD再拆分重组——strftime本身就可以直接生成你要的格式,只需要对转义符做一点处理:
import datetime def create_url(check_in: datetime.date) -> str: """take date such as '2018-06-05' and transform to format '06%2F05%2F2018'""" # 用%%输出一个%,所以%m%%2F就是月份+%2F formatted_arrival = check_in.strftime("%m%%2F%d%%2F%Y") return f"https://www.website.com/?arrival={formatted_arrival}"
这种写法更简洁,没有中间变量的类型问题,也更符合Python的简洁风格。
mypy的这种严格检查其实是帮你提前规避潜在的错误,比如如果后续代码不小心把_check_in当成字符串用,就会触发运行时错误,所以遵循它的提示优化代码是很有好处的。
内容的提问来源于stack exchange,提问作者Wessi
相关产品推荐
相关产品推荐

