Как следует печатать __add__ в подклассе списка?Python

Программы на Python
Ответить
Anonymous
 Как следует печатать __add__ в подклассе списка?

Сообщение Anonymous »

Это упрощение моего кода:

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

# my_list.py
from __future__ import annotations

class MyList(list[int]):
def __add__(self, other: list[int]) -> MyList:
return MyList()
mypy говорит:

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

> mypy .\my_list.py --strict
my_list.py:5: error: Signature of "__add__" incompatible with supertype "list"  [override]
my_list.py:5: note:      Superclass:
my_list.py:5: note:          @overload
my_list.py:5: note:          def __add__(self, list[int], /) -> list[int]
my_list.py:5: note:          @overload
my_list.py:5: note:          def [_S] __add__(self, list[_S], /) -> list[_S | int]
my_list.py:5: note:      Subclass:
my_list.py:5: note:          def __add__(self, list[int], /) -> MyList
Если я это сделаю, mypy больше не будет жаловаться:

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

from typing import overload, TypeVar

_T = TypeVar("_T")

class MyList(list[int]):
@overload
def __add__(self, other: list[int]) -> list[int]:
...

@overload
def __add__(self, other: list[_T]) -> list[_T | int]:
...

def __add__(self, other: list[_T] | list[int]) -> list[_T | int]:
return [0]
... но тогда нет смысла добавлять MyList в возвращаемые списки...
Кроме того, проблема усугубляется, если мы попытаемся добавить метод __iadd__... Тогда он либо скажет, что его сигнатура несовместима с сигнатурой __add__, либо несовместима с подпись какого-то суперкласса...

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

Signature of "__iadd__" incompatible with "__add__" of supertype "list"  [override]
Signatures of "__iadd__" and "__add__" are incompatible  [misc]
Для меня здесь все должно быть очень просто, но это не так. Также я знаю о принципе замены Лискова и думаю, что учел его во всех своих тестах.


Подробнее здесь: https://stackoverflow.com/questions/792 ... ss-of-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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