Python @classmethod y sugerencia de tipo para devoluciones del constructor estático: NameError: nombre,..., no está definido

CorePress2024-01-24  13

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

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare