tipos modelo estructura campos python python-3.x type-hinting

python - estructura - modelo odoo



Nombre no definido en la anotaciĆ³n de tipo (2)

Actualmente estoy trabajando en la creación de un módulo de álgebra lineal de Python para divertirme y practicar con el lenguaje. Recientemente intenté agregar anotaciones de tipo al módulo, como tal:

class Vector: # Various irrelevant implementation details def __add__(self, other: Vector) -> Vector: # More implementation details....

Sin embargo, cuando intento importar esto, escupe un NameError: Name ''Vector'' is not defined . Reconozco que esta pregunta ya ha sido respondida, en una forma, here , pero no parece proporcionar una respuesta completa para mi situación.

Lo que me gustaría saber:

  • Definí la clase literalmente en este archivo. ¿Por qué dice que el nombre no está definido?
  • ¿Cómo defino Vector de tal manera que pueda usarse para anotaciones (como type )?

Si está utilizando Python 3.7 y superior. Eche un vistazo a Evaluación pospuesta de anotaciones

Desde Python 3.7, se permitirá, solo agregue:

from __future__ import annotations

Y también tenga en cuenta que

Se convertirá en el valor predeterminado en Python 4.0.


Tienes una declaración adelantada; las funciones (que se vincularán como métodos) se crean antes de que la clase lo sea, por lo que el nombre Vector aún no existe. Solo cuando se haya ejecutado todo el cuerpo de la clase, Python puede crear el objeto de class y vincularlo con el nombre Vector .

Simplemente use una cadena con el nombre en su lugar:

class Vector: # Various irrelevant implementation details def __add__(self, other: ''Vector'') -> ''Vector'': # More implementation details....

Esto no afecta cómo su IDE ve la declaración; las cadenas se buscan una vez que se carga todo el módulo y se resuelven como una expresión Python válida en el contexto actual. Dado que la clase Vector existe una vez que se carga todo el módulo, la cadena ''Vector'' se puede convertir correctamente al objeto de clase.

Consulte también la especificación sobre referencias directas :

Cuando una sugerencia de tipo contiene nombres que aún no se han definido, esa definición puede expresarse como un literal de cadena, para resolverse más adelante.

[...]

El literal de cadena debe contener una expresión Python [...] válida y debe evaluar sin errores una vez que el módulo se haya cargado completamente.