Pretty Conf¶
prettyconf
es un paquete Python que facilita la creación de ficheros de configuración mediante la parametrización de sus variables.
Es habitual no incluir credenciales o datos sensibles en el control de versiones de ciertos proyectos de software. Para esto hay varias soluciones, pero la que nos propone prettyconf
es utilizar una función genérica config()
que se encargará de recuperar estos datos bien desde variables de entorno o bien desde un fichero .env
.
Instalación¶
Modo de uso¶
Su modo de uso es muy sencillo:
-
- Se busca
PASSWORD
en variables de entorno o en fichero.env
- Si se encuentra, se asigna su valor a la variable
PASSWD
- Si no se encuentra, se eleva una excepción
UnknownConfiguration
.
- Se busca
Ficheros .env¶
Aunque también existe la posibilidad de definir los valores mediate variables de entorno suele ser habitual utilizar un fichero de configuración .env
para ello.
Su estructura es realmente simple:
- Aunque podría ir sin comillas dobles, lo más fácil —para evitar errores— es ponerlas siempre.
Fuera de control de versiones
Es crucial dejar fuera del control de versiones el archivo .env
mediante su inclusión en el fichero .gitignore
.
Conversiones¶
Por defecto, cualquier valor que le demos a una variable mediante prettyconf
se interpretará como una cadena de texto (str
).
Pero es posible indicar conversiones explícitas en la propia llamada a la función:
Conversión | Explicación | Valor ITEM |
Ejemplo |
---|---|---|---|
config.boolean |
Convierte a booleano(1) | 'On' |
config(ITEM, cast=config.boolean) True |
config.list |
Convierte a lista(2) | 'A,B,C' |
config(ITEM, cast=config.list) ['A','B','C'] |
config.tuple |
Convierte a tupla(3) | 'A,B,C' |
config(ITEM, cast=config.tuple) ('A','B','C') |
config.json |
Convierte a objeto Python(4) | '{"a": [1, 2], "b": [3, 4]}' |
config(ITEM, cast=config.json) {'a': [1, 2], 'b': [3, 4]} |
- Ejemplos:
On|Off
,1|0
,yes|no
,true|false
,t|f
- Desde cadenas de texto separadas por comas.
- Desde cadenas de texto separadas por comas.
- Desde cadena de texto con objeto JSON.
Conversiones personalizadas¶
Además de las conversiones predefinidas es posible crear conversiones personalizadas mediante una función propia.
Por ejemplo, supongamos una configuración que almacena latitud y longitud de un determinado lugar (geolocalización):
def geoloc(loc: str) -> tuple[float, float]:
return tuple(float(v) for v in loc.split(','))
TEIDE_GPS = config('TEIDE_GPS', cast=geoloc)
Con esto podríamos «leer» un fichero de configuración tipo:
- Esto se convertiría en una tupla:
(28.2723364, -16.6631076)
(cuyos valores ya estarían en formato flotante).