Python dataclass中Optional类型注解引发mypy报错的解决问询
解决Dataclass Optional类型注解的Mypy报错问题
方案1:添加非空断言
在调用grid的方法前,用断言明确告诉mypy此时grid不可能为None:
self.grid = self.create_grid() # 断言grid非空,消除mypy的None类型顾虑 assert self.grid is not None self.grid.load_grid_values(...)
方案2:使用类型强制转换
通过typing.cast直接指定grid的类型,跳过mypy的Optional检查:
from typing import cast # 强制转换为Grid类型 grid = cast(Grid, self.grid) grid.load_grid_values(...)
方案3:重构初始化逻辑(推荐)
调整Sudoku的初始化流程,避免grid初始化为None。直接在实例创建时完成grid的初始化,这样可以把grid的类型注解从Grid | None改为Grid:
from dataclasses import dataclass @dataclass class Grid: size: int # 其他字段及方法... @dataclass class Sudoku: size: int grid: Grid def __init__(self, size: int): self.size = size self.grid = self.create_grid() def create_grid(self) -> Grid: return Grid(self.size)
关于__post_init__无效的说明
如果之前尝试__post_init__仍报错,是因为mypy无法自动追踪该方法中对grid的赋值。解决方法是在__post_init__末尾添加assert self.grid is not None,让mypy确认grid已完成初始化。
内容的提问来源于stack exchange,提问作者ConSod
相关产品推荐
相关产品推荐

