我有以下课程,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方法,但错误仍然存在。
如果你考虑一下namedtuple的工作原理,这就很有意义了。它是一个代码生成器,它创建一个新类型。
因此,如果您像这样在类 init 期间使用它,您将生成一个新类型 per-instance,并且
Record
的不同实例将具有不同的 self.Data
类型,即使它们具有相同的类型名和田野。
像 MyPy 这样的类型检查器不能做任何有用的事情,因为属性值是在运行时动态创建的类型。