MyPy 报告问题:不支持 NamedTuple 类型作为属性

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

我有以下课程,MyPy 正在报告

NamedTuple type as an attribute is not supported
属性的问题
self.Data

from collections import namedtuple
from collections.abc import MutableSequence

class Record(MutableSequence):
    def __init__(self, recordname: str, fields: list, records=None):
        if records is None:
            records = []
        self.fields = fields
        defaults = [""] * len(fields)
        self.Data = namedtuple(recordname, self.fields, defaults=defaults)
        self._records = [self.Data(**record) for record in records]
        self.valid_fieldnames = set(self.fields)

        self.lookup_tables: dict = {}

    def __getitem__(self, idx):
        return self._records[idx]

    def __setitem__(self, idx, val):
        self._records[idx] = self.Data(**val)

    def __delitem__(self, idx):
        del self._records[idx]

    def __len__(self):
        return len(self._records)

    def insert(self, idx, val):
        a = self._records[:idx]
        b = self._records[idx:]
        if isinstance(val, self.Data):
            self._records = a + [val] + b
        else:
            self._records = a + [self.Data(**val)] + b

我不明白 MyPy 报告的问题是什么,也没有在网上查找。代码实际上按预期运行,没有任何错误;只有 MyPy 报告了问题,我只是想了解它是什么。

一些附加信息:我在 VS Code 中使用 Python-3.12 和官方 MyPy 类型检查器扩展,这就是报告问题的原因。

我尝试了一些方法来查看错误是否会消失,但没有一个起作用。例如,我删除了

MutableSequence
作为父类,删除了namedtuple构造函数的默认值,并删除了所有dunder方法,但错误仍然存在。

python python-typing mypy
1个回答
0
投票

如果你考虑一下namedtuple的工作原理,这就很有意义了。它是一个代码生成器,它创建一个新类型。

因此,如果您像这样在类 init 期间使用它,您将生成一个新类型 per-instance,并且

Record
的不同实例将具有不同的
self.Data
类型,即使它们具有相同的类型名和田野。

像 MyPy 这样的类型检查器不能做任何有用的事情,因为属性值是在运行时动态创建的类型。

© www.soinside.com 2019 - 2024. All rights reserved.