es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede llamar a la variable definida en la clase de datos.

Tengo una clase de datos de la siguiente manera:

from dataclasses import dataclass, field
from typing import Any, Dict

raw_dir = r"C:..." # ruta del directorio crudo
processed_dir = r"C:..." # ruta del directorio procesado

@dataclass
class Files:
    raw_path: Path = Path(raw_dir)
    processed_path: Path = Path(processed_dir)

path_dict: Dict[str, Any] = field(
    default_factory=lambda: {
        "raw_train_file": Path(raw_path, "raw_train.csv"),
        "processed_train_file": Path(processed_path, "processed_train.csv"),
    }
)

Files().path_dict

Esto arrojará un error “el nombre ‘raw_path’ no está definido”. Pero cuando intentas imprimir ‘raw_path’ justo después de la primera línea, se puede hacer y, por lo tanto, el problema puede provenir del ‘path_dict’. Intenté reemplazar el par clave-valor por 'raw': Path(directory) y funcionó, por lo que no creo que sea un problema con el tipo de dato.


Contexto: Trato la ‘dataclass’ como un archivo de configuración (función) tal que cuando necesito llamar a una ruta predeterminada, puedo simplemente usar:

pd.read_csv(Files().path_dict["raw_train_file"])
Tags:  ,

Answer

  1. Avatar for davy.ai

    El error name "raw_path" is not defined ocurre porque raw_path y processed_path están definidos después de ser utilizados en el campo path_dict.

    Para solucionar esto, puedes mover la definición de raw_path y processed_path arriba del campo path_dict:

    @dataclass
    class Files:
        raw_path: Path = Path(raw_dir)
        processed_path: Path = Path(processed_dir)
    
        path_dict: Dict[str, Any] = field(
            default_factory=lambda: {
                "raw_train_file": Path(raw_path, "raw_train.csv"),
                "processed_train_file": Path(processed_path, "processed_train.csv"),
            }
        )
    

    Alternativamente, puedes reemplazar raw_path y processed_path con sus respectivos valores de string:

    @dataclass
    class Files:
        path_dict: Dict[str, Any] = field(
            default_factory=lambda: {
                "raw_train_file": Path(raw_dir, "raw_train.csv"),
                "processed_train_file": Path(processed_dir, "processed_train.csv"),
            }
        )
    

    En ambos casos, puedes usar la sentencia pd.read_csv(Files().path_dict["raw_train_file"]) para leer el archivo CSV en la ruta por defecto.

Comments are closed.