Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

350
Vistas
python tipeado: usando el tipo propio de las clases dentro de la definición de clase

El siguiente código no funciona como se esperaba. Aparentemente, no puedo usar el tipo propio de las clases dentro de la definición de clase:

 class Foo: def __init__(self, key :str) -> None: self.key = key def __eq__(self, other :Foo) -> bool: return self.key == other.key print('should be true: ', Foo('abc') == Foo('abc')) print('should be false: ', Foo('abc') == Foo('def'))

El resultado de ejecutarlo es:

 Traceback (most recent call last): File "class_own_type.py", line 1, in <module> class Foo: File "class_own_type.py", line 5, in Foo def __eq__(self, other :Foo) -> bool: NameError: name 'Foo' is not defined

Además, verificar el código con mypy devuelve:

 class_own_type.py:5: error: Argument 1 of "__eq__" incompatible with supertype "object"

¿Cómo puedo corregir este código para que sea válido, tanto para Python como para mypy ?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El nombre Foo aún no está vinculado, porque la clase en sí aún no se ha definido en el momento en que intenta usar el nombre (recuerde: los argumentos de la función se evalúan en el momento de la definición de la función, no en el momento de la llamada de la función).

Desde Python 3.7+, puede posponer la evaluación de las anotaciones agregando esta importación en la parte superior del módulo:

 from __future__ import annotations

En Python 3.10, la evaluación pospuesta se convertirá en el comportamiento predeterminado. Para Python < 3.7, puede usar cadenas literales para retrasar la evaluación del tipo:

 class Foo: def __init__(self, key :str) -> None: self.key = key def __eq__(self, other: 'Foo') -> bool: return self.key == other.key print('should be true: ', Foo('abc') == Foo('abc')) print('should be false: ', Foo('abc') == Foo('def'))
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda