Tengo un decorador bastante complejo escrito por otra persona. Lo que quiero hacer es llamar una versión decorada de la función una vez basada en una desición o llamar a la función original (no decorada) en otro momento. es posible?Funciones de decoración de Python antes de la llamada
9
A
Respuesta
26
Con:
decorator(original_function)()
Sin:
original_function()
Un decorador es sólo una función que toma una función como argumento y devuelve otro. La sintaxis @ es totalmente opcional. Tal vez un tamiz a través de documentation podría ayudar a aclarar las cosas.
2
def original_function():
pass
decorated_function= decorator(original_function)
if use_decorated:
decorated_function()
else:
original_function()
Decorar solo una vez, y luego elegir qué versión llamar.
1
Aquí está la receta que surgió para el problema. También necesitaba mantener las firmas iguales, así que usé el módulo decorador, pero se podía volver a ajustar para evitar eso. Básicamente, el truco fue agregar un atributo a la función. La función 'original' está desatada, por lo que necesita pasar un 'auto' como primer parámetro, así que agregué un código adicional para verificarlo también.
# http://www.phyast.pitt.edu/~micheles/python/decorator-2.0.1.zip
from decorator import decorator, update_wrapper
class mustbe : pass
def wrapper (interface_) :
print "inside hhh"
def call (func, self, *args, **kwargs) :
print "decorated"
print "calling %s.%s with args %s, %s" % (self, func.__name__, args, kwargs)
return interface_ (self, *args, **kwargs)
def original (instance , *args, **kwargs) :
if not isinstance (instance, mustbe) :
raise TypeError, "Only use this decorator on children of mustbe"
return interface_ (instance, *args, **kwargs)
call = decorator (call, interface_)
call.original = update_wrapper (original, call)
return call
class CCC (mustbe):
var = "class var"
@wrapper
def foo (self, param) :
"""foo"""
print self.var, param
class SSS (CCC) :
@wrapper (hidden_=True)
def bar (self, a, b, c) :
print a, b, c
if __name__ == "__main__" :
from inspect import getargspec
print ">>> i=CCC()"
i=CCC()
print ">>> i.var = 'parrot'"
i.var = 'parrot'
print ">>> i.foo.__doc__"
print i.foo.__doc__
print ">>> getargspec(i.foo)"
print getargspec(i.foo)
print ">>> i.foo(99)"
i.foo(99)
print ">>> i.foo.original.__doc__"
print i.foo.original.__doc__
print ">>> getargspec(i.foo.original)"
print getargspec(i.foo.original)
print ">>> i.foo.original(i,42)"
i.foo.original(i,42)
print ">>> j=SSS()"
j=SSS()
print ">>> j.bar(1,2,3)"
j.bar(1,2,3)
Cuestiones relacionadas
- 1. Funciones dinámicas de llamada - Python
- 2. Funciones de llamada de re.sub
- 3. @ personaje antes de una llamada de función
- 4. Funciones de Python Confusión
- 5. funciones de devolución de llamada de escritura
- 6. Ejecutar código antes de que se ejecute la función llamada
- 7. CSS decoración de texto múltiple
- 8. comentando funciones de devolución de llamada
- 9. Funciones de llamada de otra "clase"/archivo
- 10. Jquery: esperar la devolución de llamada antes de devolver
- 11. Llamada de evento antes de descargar la página
- 12. Boost.Python: Devolución de llamada a funciones de clase
- 13. Python añadir dinámicamente decorador a la clase métodos mediante la decoración de la clase
- 14. Python: ¿salida de funciones?
- 15. Funciones explotables de Python
- 16. Jquery: funciones de llamada desde diferentes documentos
- 17. Objetos de Python como datos de usuario en las funciones de devolución de llamada ctypes
- 18. Función de llamada Python dentro de la clase
- 19. Estilo de decoración de texto heredado
- 20. Python: la creación de funciones dinámicas
- 21. llamada de función python con la variable
- 22. ¿Hay algún uso para la decoración de tiro de C++?
- 23. Xlib ¿Cómo funciona esto (quitar la decoración de la ventana)?
- 24. devolución de llamada de Dojo antes de AJAX
- 25. Funciones de Python y su atributo __call__
- 26. C/C++ función/método de decoración
- 27. ¿Cuál es una buena manera de proporcionar decoración/metadatos adicionales para los parámetros de la función Python?
- 28. texto-decoración: subrayado vs fondo de borde
- 29. Funciones de devolución de llamada de javascript con ajax
- 30. Funciones de devolución de llamada de Javascript y recursión
El enlace está roto :( –
Link is fixed :) – chishaku