Esta pregunta ya tiene respuestas aquí:
¿Cómo escribo un método con el tipo de clase adjunta?
(9 respuestas)
Cerrado
hace 2 años
.
Quiero agregar una sugerencia de tipo para las quejas del generador estático y de Python 3 de que el nombre de la clase no está definido:
class Options(object):
def __init__(self, path: str):
self._path = path
@property
def path(self):
return self._path
class Config(object):
def __init__(self, path: str):
self._path = path
@classmethod
def from_options(cls, options: Options) -> Config:
return cls(options.path)
en python3 1.py devuelve:
Traceback (most recent call last):
File "1.py", line 9, in <module>
class Config(object):
File "1.py", line 14, in Config
def from_options(cls, options: Options) -> Config:
NameError: name 'Config' is not defined
2
Además, no estás utilizando correctamente un método de clase. Si va a utilizar un método de clase, debe utilizar el argumento cls, en este caso, cls(options.path). O bien, conviértalo en un método estático real. O en Python... simplemente una función a nivel de módulo (que casi siempre puede tener el mismo propósito que un método estático).
juanpa.arrivillaga
26/03/2021 a las 21:05
@juanpa.arrivillaga Pregunta actualizada. Ese error tipográfico se produjo durante la extracción del problema del código (escrito desde la memoria).
- gavenkoa
26/03/2021 a las 21:26
------------------------------------
El nombre de una clase no existe hasta que finaliza el bloque clase.... Si desea utilizar el nombre como anotación de tipo en un método, debe escribirlo entre comillas:
@classmethod
def from_options(cls, options: Options) -> "Config":
return cls(options.path)
Respondido
26 de marzo de 2021 a las 20:56
jwodder
jwodder
55,6k
12
12 insignias de oro
110
110 insignias de plata
128
128 de bronce insignias
1
2
No, utilizar desde __future__ anotaciones de importación
juanpa.arrivillaga
26/03/2021 a las 21:07
------------------------------------
No puedes usar un nombre de clase durante la definición de esa clase. Generalmente, no deberíamos necesitar hacerlo, pero para la verificación de tipos tiene mucho sentido necesitar hacer referencia a una clase durante su propia definición. Afortunadamente, las reglas de sugerencias de tipo Python tienen una disposición para esto: referencias directas. Los nombres de tipos pueden aparecer como cadenas, siempre que lo que esté dentro de la cadena sea un tipo válido.
@classmethod
def from_options(cls, options: Options) -> 'Config':
return cls(options.path)
Respondido
26 de marzo de 2021 a las 20:56
Silvio Mayolo
Silvio Mayolo
67,3k
6
6 oro maloges
84
84 insignias de plata
125
125 insignias de bronce
1
2
Esto está bastante desactualizado. En Python 3.7+ debes usar anotaciones de importación from __future__. Este se convierte en el comportamiento predeterminado en Python 3.10
juanpa.arrivillaga
26/03/2021 a las 21:07