Как ввести аннотацию метода, который возвращает self?Python

Программы на Python
Anonymous
Как ввести аннотацию метода, который возвращает self?

Сообщение Anonymous »

Предположим, у меня есть класс, реализующий цепочку методов:

Код: Выделить всё

from __future__ import annotations

class M:
def set_width(self, width: int)->M:
self.width = width
return self

def set_height(self, height: int)->M:
self.height = height
return self
Я мог бы использовать это так:

Код: Выделить всё

box = M().set_width(5).set_height(10)
Это работает, но если у меня есть подкласс M3D:

Код: Выделить всё

class M3D(M):
def set_depth(self, depth: int) -> M3D:
self.depth = depth
return self
Теперь я не могу этого сделать:

Код: Выделить всё

cube = M3D().set_width(2).set_height(3).set_depth(5)
Я получаю следующую ошибку в mypy:

Код: Выделить всё

_test_typeanotations.py:21: error: "M" has no attribute "set_depth"; maybe "set_width"
Потому что set_width() возвращает M, у которого нет метода set_length. Я видел предложения переопределить set_width() и set_height() для каждого подкласса, чтобы указать правильные типы, но для каждого метода пришлось бы писать много кода. Должен быть более простой способ.
Это также актуально для специальных методов, например __enter__ традиционно возвращает self, поэтому было бы неплохо иметь способ указать это без необходимости даже упоминать об этом в подклассах.

Подробнее здесь: https://stackoverflow.com/questions/665 ... turns-self

Вернуться в «Python»