miércoles, 18 de mayo de 2016

Crear una simple clase de configuraciones en Python 3

Hola, que más, cómo la han pasado. A veces queremos crear una clase Python que nos gestione las configuraciones establecidas en un archivo, de esta forma poder usarlas en nuestra aplicación. A continuación, explicaré una forma algo sencilla de cómo crear tu propia clase gestora de configuraciones.

Lo que se quiere es que mediante un archivo, sea el nombre que sea, nuestra aplicación en Python pueda leer valores asignados a variables:
# configuraciones del servidor
host = localhost
port = 8080
server = relax.com
# entre otras configuraciones

Entonces, en la aplicación nos vamos a referir a estos valores (host, port, server, etc.) como variables de un objeto de la clase gestora de configuraciones. Para ir entrando en ésto llamaré a esta clase GestorAjuste y de ella ser creará el objeto ajuste. A continuación, la definición de esta clase.

#!/usr/bin/python3
# -*- coding: utf-8 -*- 
import sys

# definimos la clase
class GestorAjuste(object):

    def __init__(self):
        contenido = ''
        with open('config', 'r') as config:
            contenido = config.read()

        # obtenemos las configuraciones línea por línea
        for linea in contenido.split('\n'):
        # no leemos comentarios
            if linea[0] == '#':
                continue

            # guardamos las configuraciones en esta clase
            # comprobamos que están bien formadas
            seccion = linea.split('=')
            if len(seccion) != 2:
                sys.stderr.write('Error. configuraciones mal formada: %s\n' % linea)
                sys.exit(1)

            ajuste = seccion[0].strip()
            valor = seccion[0].strip()
            self.__dict__[ajuste] = valor

        # finalmente terminamos
        sys.stdout.write('[Ajuste] leido totalmente\n')

    def __getattri__(self, attr):
        sys.stderr.write('Error. El atributo ' + str(attr) + ' no existe aquí.\n')
        return None


Como se puede observar en el método __init__(self) leemos el contenido del archivo config para luego dividirlo por líneas, pero pude haberlo hecho con el método readline() es que en este caso quedó así. Después, comenzamos a leer cada línea e ignoramos los comentarios que son identificados por el símbolo # al comienzo de la línea. Para el resto, comprobamos que esté de la forma:

variable = valor

Usándose una forma muy sencilla de comprobarlo. A continuación, se divide la línea en lo que está antes del símbolo igual y lo que está después, seguidamente se envían estos valores al atributo __dict__ (el cual es un diccionario) que nos permite agregar atributos al objeto en tiempo de ejecución, finalmente mostramos un mensaje por la salida estándar. También, re-definimos el método llamado __getattri__(self, attr), que es llamado cuando intentamos acceder a un atributo que no está definido en el objeto, con el fin de evitar errores posteriores.

Ahora podemos usarlo en nuestro código y jugar con ello. Imaginemos que usamos el ejemplo de configuración que puse al comienzo de artículo.

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import socket

ajuste = GestorAjuste()

visa = socket.socket() # algo rápido
visa.connect((ajuste.host, int(ajuste.port)))

if ajuste.server != 'relax.com':
    exit(0)

pass
# continuamos el programa.


Para terminar queda decir que éste es una forma de hacerlo y de hacer una clase gestora de configuraciones. A esta clase le faltaría algunos métodos que le permita guardar de regreso en el archivo los cambios realizados, sólo que he pensado que no es necesario al menos que tú quieras porque eres rebelde. Yo digo que si vas a leer configuraciones, que son valores que me ajustará el comportamiento del software, no necesito cambiarlas desde el mismo programa. Aunque, pensándolo bien creo que si es necesario, pero bueno, yo lo hice así. Ahora es tú oportunidad de personalizar este código.

También falta por decir que existe un módulo en Python llamado configparser que permite leer configuraciones en archivos con un formato parecido a los .INI, así como lo mencionan en está página. Puedes revisar y comparar, chao.


No hay comentarios:

Publicar un comentario