我收到的代码基本上通过将所有基本字段复制粘贴到每个子结构来描述继承:
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)
]
# And so on...
Foo
和Bar
都具有Base
的所有字段。但 mypy/pyright/pylance 的类型缩小讨厌元组不都是同一类型。
vscode 输出:
Operator "+" not supported for types "Sequence[tuple[str, type[_CData]] | tuple[str, type[_CData], int]]" and "list[tuple[Literal['world'], type[c_int64]]]" PylancereportOperatorIssue
如何通过最小的改变让工具满意?
从
+
串联更改为嵌入*
传播工作。
class Foo(ct.Structure):
_fields_ = [
*Base._fields_,
("world", ct.c_int64)
]
使用 Base 作为
_anonymous_
字段也可能是一种选择
class FooAlt(ct.Structure):
_anonymous_ = ("base",)
_fields_ = [
("base", Base),
("world", ct.c_int64)
]