functools.update_wrapper

Este post se alinea con la serie Decoradores en Python (I, II, III) pero no es tan elaborado como para ser Decoradores en Python (IV) :)

Desde Python 2.5, al crear un decorador, se puede utilizar functools.update_wrapper para quela versión decorada de la función, tenga los atributos __name__, __doc__, __module__ y __dict__ de la función original.

>>> import functools
>>> def deco(f):
...     def inner(*a, **kw):
...             print "Este decorador no hace nada"
...             return f(*a, **kw)
...     return inner
...
>>> def saludo():
...     print "hola"
...
>>> saludo2 = deco(saludo)
>>> saludo2()
Este decorador no hace nada
hola
>>> saludo2.__name__
'inner'
>>> def deco(f):
...     def inner(*a, **kw):
...             print "Este decorador no hace nada"
...             return f(*a, **kw)
...     return functools.update_wrapper(inner, f)
...
>>> saludo3 = deco(saludo)
>>> saludo3()
Este decorador no hace nada
hola
>>> saludo3.__name__
'saludo'
>>> saludo = saludo3

About Juanjo

Mi nombre es Juanjo Conti, vivo en Santa Fe y soy Ingeniero en Sistemas de Información. Mi lenguaje de programación de cabecera es Python; lo uso para trabajar, estudiar y jugar. Como hobby escribí un libro de cuentos que se puede descargar gratuitamente.
This entry was posted in Aprendiendo Python and tagged , , . Bookmark the permalink.
  • http://pyvore.com/ John Lenton

    fijate functools.wrap: un decorador que aplica update_wrapper a la función que le das de argumento