Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

148
Visualizações
Heredar clases genéricas con TypeVar restringido

Considere un par simple de clases genéricas:

 T = TypeVar("T", str, int) class Base(Generic[T]): def __init__(self, v: T): self.v: T = v @property def value(self) -> T: return self.v class Child(Base[T]): def __init__(self, v: T): super().__init__(v) x = Child(123) reveal_type(x.value)

Mientras que el uso de T = TypeVar("T") funciona como se esperaba. El TypeVar restringido como se muestra produce los siguientes errores:

 error: Argument 1 to "__init__" of "Base" has incompatible type "str"; expected "T" error: Argument 1 to "__init__" of "Base" has incompatible type "int"; expected "T" note: Revealed type is 'builtins.int*'

Tenga en cuenta que el reveal_type todavía funciona.

Otra diferencia es que la TypeVar restringida requiere la anotación de tipo para la asignación self.v mientras que la no restringida no.

En el caso de uso completo, en realidad tengo Callable[[Any], T] , pero el problema es el mismo.

Esto es con mypy 0.910 y Python 3.9.7 .

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Esto parece suceder cada vez que llama a super() y pasa el argumento TypeVar restringido genérico a cualquier función, no solo a init . En esos casos, creo que podemos pedirle a mypy que deje esta pobre cosa como está, incluyendo # type: ignore en esas líneas:

 ... super().__init__(v) # type: ignore ...

No es tan malo como parece porque la verificación de tipo se seguirá haciendo en otras líneas, de manera diferente a lo que sucedería si elimina : T del parámetro en la función principal o en la función secundaria (cualquiera de ellos sería suficiente para suprimir las quejas) , pero también dejaría de verificar dentro de esas funciones).

over 4 years ago · Santiago Trujillo Relatório

0

Limitar T a una Union[int,str] debería hacer el trabajo:

 T = TypeVar("T", bound=Union[str, int]) class Base(Generic[T]): def __init__(self, v: T): self.v: T = v @property def value(self) -> T: return self.v class Child(Base[T]): def __init__(self, v: T): super().__init__(v) x = Child(123) reveal_type(x.value) y = Child('a') reveal_type(y.value)
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda