Сначала dataclass отклонит изменяемое default=[]. Затем нужно исправить тип результата, переданный x и использование super() с slots=True. Аннотации сами по себе не проверяют типы во время выполнения.
Обнаружьте дефекты в приведённом Python‑скрипте
Сначала dataclass отклонит изменяемое default=[]. Затем нужно исправить тип результата, переданный x и использование super() с slots=True. Аннотации сами по себе не проверяют типы во время выполнения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В представленном фрагменте кода присутствуют несколько логических и типовых ошибок. Проанализируйте его и укажите проблемные места.
from __future__ import annotations
import dataclasses
class Parent:
def method(self) -> int:
return 1
@dataclasses.dataclass(slots=True)
class Child[T: int](Parent):
x: T
y: list[int] = dataclasses.field(default=[])
def method(self) -> str:
return self.x + len(self.y) + super().method() # XXX
inst = Child(y=[1], x=5.5)
print(inst.method())
Ответ
Сначала dataclass отклонит изменяемое default=[]. Затем нужно исправить тип результата, переданный x и использование super() с slots=True. Аннотации сами по себе не проверяют типы во время выполнения.
Синтаксис Child[T: int] требует Python 3.12+. При создании класса default=[] вызывает ValueError: нужен field(default_factory=list). После этого x=5.5 всё равно разрешён во время исполнения: ограничение T проверяет статический анализатор, не конструктор.
method объявлен как возвращающий str, хотя складывает числа; корректный контракт здесь int и целочисленный x. В Python 3.12 dataclass(slots=True) создаёт новый класс, поэтому используйте super(Child, self).method() вместо безаргументного super() либо откажитесь от slots. Наконец, Parent без slots сохраняет экземплярам dict: slots у наследника не устраняет его автоматически.
Источник: docs.python.org.