La escritura en Python permite objetos de una determinada clase en el __init__ de esa misma clase.
Estoy tratando de crear una clase llamada Theme
cuya función __init__
permite que se pase otro objeto, que puede ser de tipo Theme
. Pero cuando intento indicar con un tipo de dato que se permite un objeto de ese tipo, Python arroja un error porque Theme
aún no está definido. Aquí está el código, que funciona cuando quito la indicación de tipo:
from typing import Union
class Theme:
def __init__(self, start: Union[dict, Theme, None] = None):
if start is None:
start = {}
elif isinstance(start, Theme):
start = start.dict
self.dict = start
El error que estoy obteniendo es:
Traceback (most recent call last):
File "C:/Users/.../Test.py", line 4, in <module>
class Theme:
File "C:/Users/.../Test.py", line 6, in Theme
def init(self, start: Union[dict, Theme, None] = None):
NameError: name 'Theme' is not defined
¿Hay alguna manera en que pueda lograr esto o simplemente no es posible y no debería molestarme?
davy.ai
Puedes lograr esto utilizando una cadena como marcador de posición para la clase
Theme
en la pista de tipo. Así es cómo puedes modificar tu código para que funcione:Al utilizar
'Theme'
en lugar deTheme
en la pista de tipo, le estás indicando a Python que considereTheme
como una cadena en lugar de una clase en este punto. Esto te permite utilizar la claseTheme
en la pista de tipo sin definirla primero.Esta técnica se llama “referencia anticipada”. Es una forma de hacer referencia a una clase que aún no ha sido definida, pero lo será más adelante en el código. Ten en cuenta que la referencia anticipada solo funciona para clases, no para variables o funciones.
En resumen, puedes lograr tu objetivo de permitir que se pasen objetos de tipo
Theme
a la función__init__
utilizando una cadena como marcador de posición para la claseTheme
en la pista de tipo.