Hola comunidad! Qué raro ehh?! un artículo nuevo de @Akiel y en plenas vacaciones. El cielo se va a caer ;).

Bueno, lo cierto es que yo particularmente no tengo vacaciones y no escribo más porque tengo mucho trabajo. De cualquier forma, estaba hoy pensando y me dije, vamos a escribir sobre algo que puede ayudar a algunos a mejorar su arsenal de programación y bueno, aquí voy.

Como todos saben el cubano pasa la mayor parte de su tiempo desconectado de Internet. Incluso en las condiciones universitarias en las que contamos con una conexión completamente gratuita, es muy limitado nuestro acceso a la Red de Redes. Esto complica un poco las cosas cuando estamos fabricando aplicaciones que se supone que trabajen online. Imaginen que solo puedan trabajar en su proyecto cuando estén conectados.

Muchos de nosotros asumen una práctica bastante eficaz en estas situaciones. Un comentario en el código por aquí, un return True por acá y resuelto el problema, hasta que vamos a probar nuestra app online y tenemos que pasar 20 minutos descomentando y arreglando código. (Experiencia propia)

Creando el decorador

Hoy les voy a dejar con una receta (bien personal) de como he estado lidiando con estos problemas últimamente. La estrategia es la siguiente: vamos a hacer un decorador que devuelva un valor por defecto a los métodos que utilizan contenido online.

Creamos un fichero al cual llamaremos sandbox.py en algún lugar de nuestro proyecto y en el pondremos lo siguiente:

from functools import wraps

SANDBOX = True

def offline_sandbox_value(value):
    def decorator(func):
        @wraps(func)
        def inner(*args, **kwargs):
            if SANDBOX:
                print 'sandboxed',value
                return value
            else:
                return func( *args, **kwargs)
        return inner
    return decorator

Esta función no es más que un decorador que en caso de que el valor de la variable SANDBOX sea True devolverá el valor especificado en value, en cambio si el valor de SANDBOX es False devolverá el resultado de ejecutar la función a la cual se ha puesto el decorador.

Utilizando la Sandbox

Pues ya que tenemos creado nuestro decorador nos aseguramos que en nuestro entorno offline el valor de SANDBOX sea siempre True y al llevar nuestro código online solo tendríamos que cambiar una línea en lugar de las n que hubiéramos tenido que modificar. Cómo lo usamos en nuestro código? Vamos a crear una función que utilice contenido/recursos online:

def obtener_recurso(recurso):
    resultado_recurso = operacion_online(recurso)
    return resultado_recurso == 1

Esta función supuestamente consultará un recurso online y devolverá True si el recurso es igual a 1. Ahora, sólo tenemos que ponerle nuestro decorador para que cuando estemos offline devuelva automáticamente True sin entrar a la función. quedando nuestro código así:

from sandbox import offline_sandbox_value


@offline_sandbox_value(True)
def obtener_recurso(recurso):
    resultado_recurso = operacion_online(recurso)
    return resultado_recurso == 1

Como deben haber notado, no es utilizable sólo cuando estamos offline sino cuando cualquier tipo de motivo impide que nuestra función se ejecute correctamente y necesitamos no perder estabilidad en nuestro programa para poder probarlo.

Y eso fue todo por hoy. Espero que les halla resultado interesante el artículo y como siempre: Happy hacking!!!