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
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