У меня есть несколько именованных кортежей, которые разделяют некоторые поля. У меня есть функция, которая принимает эти кортежи и гарантированно взаимодействует только с общими полями. Я хочу, чтобы проверить такой код в mypy.
Пример кода будет:
from typing import NamedTuple
class Base(NamedTuple):
x: int
y: int
class BaseExtended(NamedTuple):
x: int
y: int
z: str
def DoSomething(tuple: Base):
return tuple.x + tuple.y
base = Base(3, 4)
base_extended = BaseExtended(5, 6, 'foo')
DoSomething(base)
DoSomething(base_extended)
Когда я запускаю mypy для этого кода, я получаю предсказуемую ошибку:
mypy_example.py:20: ошибка: аргумент 1 для "DoSomething" имеет несовместимый тип "BaseExtended"; ожидаемая "база"
Нет ли способа структурировать мой код и поддерживать проверку типов mypy? Я не могу наследовать BaseExtended от Base, поскольку в реализации наследования NamedTuple есть ошибка:
https://github.com/python/typing/issues/427
Я также не хочу использовать некрасивый "Union [Base, BaseExtended]", так как он ломается, когда я пытаюсь проверить тип List, поскольку "List [Union [Base, BaseExtended]]" не равен "List [BaseExtended" ] "из-за некоторого количества волшебства о вариантах/ковариантных типах:
https://github.com/python/mypy/issues/3351
Должен ли я просто отказаться от идеи?