Aquí hay un ejemplo mínimo de cómo cargar y almacenar un modelo Pydantic en un archivo YAML.
Este código incluye lógica para seleccionar el primer path que sea escribible, lo que hace fácil usarlo p. ej. tanto en un contenedor como para desarrollo local
pydantic_yaml_example.py
from pydantic import BaseModel, ValidationError, Field
import yaml
import os
class MySettings(BaseModel):
variable1: float = Field(default=1.5, help="TODO enter your description here")
variable2: str = Field(default="foobar", help="TODO enter your description here")
_default_paths = ['/data/settings.yaml', './settings.yaml']
@classmethod
def from_yaml(cls) -> 'MySettings':
for path in cls._default_paths.default:
if os.path.exists(path):
with open(path, 'r', encoding="utf-8") as f:
data = yaml.safe_load(f)
return cls(**data)
# Si no existen archivos, retornar una instancia de Settings con valores por defecto
print(f"Ninguno de los archivos de settings encontrado en {cls._default_paths}. Inicializando con valores por defecto.")
_settings = cls()
_settings.save_to_first_writable_path()
return _settings
def save_to_first_writable_path(self) -> None:
for path in self._default_paths:
try:
with open(path, 'w', encoding="utf-8") as f:
yaml.safe_dump(self.model_dump(), f)
print(f"Settings guardados en {path}")
return
except IOError:
print(f"No se puede escribir en {path}")
raise IOError(f"Ninguno de los paths en {self._default_paths} son escribibles.")
def to_yaml(self) -> None:
self.save_to_first_writable_path()
# Singleton global de settings
global_settings = MySettings.from_yaml()Cuando se cambia, puedes guardarlo usando
pydantic_yaml_save.py
global_settings.save_to_first_writable_path()Si este artículo te ha ayudado, considera invitarme a un café o hacer una donación vía PayPal para apoyar la investigación y publicación de nuevos artículos en TechOverflow