Una forma de subclase NamedTuple para fines de verificación de tipos
Tengo varias tuplas con nombre que comparten algunos campos. Tengo una función que acepta estas tuplas y garantiza que solo interactuará con los campos compartidos. Quiero escribir este código en mypy.
Un ejemplo del código sería:
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)
Cuando ejecuto mypy en este código, obtengo un error predecible:
mypy_example.py:20: error: el argumento 1 de "DoSomething" tiene un tipo incompatible "BaseExtended"; "Base" esperada
¿No hay forma de estructurar mi código y mantener mypy typechecking? No puedo heredar BaseExtended de Base, ya que hay un error en la implementación de herencia NamedTuple:
https://github.com/python/typing/issues/427
Tampoco quiero usar una fea "Unión [Base, BaseExtended]", ya que esto se rompe cuando intento escribir una lista, ya que "Lista [Unión [Base, BaseExtended]]" no es igual a "Lista [BaseExtended ] "debido a cierta magia mypy sobre los tipos de variante / covariante:
https://github.com/python/mypy/issues/3351
¿Debo abandonar la idea?