mypy报错:ctypes Structure._fields_不支持"+"运算符,如何修复?
解决ctypes结构体字段继承的类型检查报错问题
我接手了一段通过复制基类字段到子类结构体来实现“继承”的ctypes代码:
import ctypes as ct class Base(ct.Structure): _fields_ = [ ("hello", ct.c_int32) ] class Foo(ct.Structure): _fields_ = Base._fields_ + [ ("world", ct.c_int64) ] class Bar(ct.Structure): _fields_ = Base._fields_ + [ ("joe", ct.c_float) ] # 还有更多类似子类...
Foo和Bar都包含Base的所有字段,但mypy、pyright、pylance这类类型检查工具会报以下错误:
Operator "+" not supported for types "Sequence[tuple[str, type[_CData]] | tuple[str, type[_CData], int]]" and "list[tuple[Literal['world'], type[c_int64]]]" PylancereportOperatorIssue
以下是几种最小改动的解决办法:
方案1:显式转换基类字段为列表
把Base._fields_转为列表类型,让类型检查器识别为可拼接的列表:
class Foo(ct.Structure): _fields_ = list(Base._fields_) + [ ("world", ct.c_int64) ] class Bar(ct.Structure): _fields_ = list(Base._fields_) + [ ("joe", ct.c_float) ]
只需要在每个子类的_fields_定义里给Base._fields_套一层list(),改动量极小。
方案2:给基类字段添加类型注解
在Base类里给_fields_显式标注为列表类型,后续子类无需修改:
class Base(ct.Structure): _fields_: list[tuple[str, type[ct._CData]] | tuple[str, type[ct._CData], int]] = [ ("hello", ct.c_int32) ]
一次修改就能适配所有子类,避免重复改动。
方案3:添加类型忽略注释
如果不想调整代码结构,直接在拼接行添加注释屏蔽错误提示:
class Foo(ct.Structure): _fields_ = Base._fields_ + [ # type: ignore[operator] ("world", ct.c_int64) ] class Bar(ct.Structure): _fields_ = Base._fields_ + [ # type: ignore[operator] ("joe", ct.c_float) ]
完全保留原有代码逻辑,仅通过注释消除类型检查报错。
内容的提问来源于stack exchange,提问作者plswork04
相关产品推荐
相关产品推荐

