Decorators


Los decorqadores te permiten hacen modificaciones simples a objetos invocables como functions, methods, or classes. Nos ocuparemos de las funciones para este tutorial. La sintaxis

@decorator
def functions(arg):
    return "Return"

Es equivalente a:

def function(arg):
    return "Return"
function=decorator(function) #this passes the function to the decorator, and reassigns it to the functions

Como habrás visto, un decorador es simplemente otra función que toma varias funciones y devuelve una. Por ejemplo podrías hacer esto:

def repeater(old_function):
    def new_function(*args, **kwds): #See learnpython.org/page/Multiple%20Function%20Arguments for how *args and **kwds works
        old_function(*args, **kwds) #we run the old function
        old_function(*args, **kwds) #we do it twice
    return new_function #we have to return the new_function, or it wouldn't reassign it to the value

Esto haría que una función se repita dos veces

>>> @repeater
def Multiply(num1, num2):
    print(num1*num2)

>>> Multiply(2, 3)
6
6

También puedes hacer que cambie la salida:

def Double_Out(old_function):
    def new_function(*args, **kwds):
        return 2*old_function(*args, **kwds) #modify the return value
    return new_function

cambiar la entrada

def Double_In(old_function):
    def new_function(arg): #only works if the old function has one argument
        return old_function(arg*2) #modify the argument passed
    return new_function

y hacer comprobaciones

def Check(old_function):
    def new_function(arg):
        if arg < 0: raise (ValueError, "Negative Argument") # This causes an error, which is better than it doing the wrong thing
        old_function(arg)
    return new_function

Digamos que quieres multiplicar la salida por una cantidad variable. Podrías hacerlo

def Multiply(multiplier):
    def Multiply_Generator(old_function):
        def new_function(*args, **kwds):
            return multiplier*old_function(*args, **kwds)
        return new_function
    return Multiply_Generator #it returns the new generator

Ahora, podrías hacer:

@Multiply(3) #Multiply no es un generador, pero Multiply(3) sí lo es
def Num(num):
    return num

Puedes hacer lo que quieras con la función antigua, ¡incluso ignorarla completamente! Los decoradores avanzados también pueden manipular el doc string y el número de argumentos Para conocer algunos decoradores elegantes, visita http://wiki.python.org/moin/PythonDecoratorLibrary. Exercise


Haz un manejador de decoradores que devuelva un decorador que decore funciones con un argumento. El manjeador debería coger un argumento, un tipo, y luego devolver un decorador que haga que la función verifique si la entrada es del tipo correcto. Si es errónea, debería imprimir "Bad Type" (En realidad, debería lanzar un error - y manejarlo - pero el manejo de errores no es parte de este tutorial). Mira el códugo del tutorial y la salida esperada si estás confundido respecto a esto (sé que es confuso). Usar isinstance(object, type_of_object) o type(object) tal vez te ayude.


Copyright © learnpython.org. Read our Terms of Use and Privacy Policy