ctypes 结构不支持 mypy 运算符“+”。_fields_

问题描述 投票:0回答:1

我收到的代码基本上通过将所有基本字段复制粘贴到每个子结构来描述继承:

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

如何通过最小的改变让工具满意?

python ctypes mypy pyright
1个回答
0
投票

+
串联更改为嵌入
*
传播工作。

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)
    ]
© www.soinside.com 2019 - 2024. All rights reserved.