He aquí, FuglyHackThatWillWorkForYourExampleButICantPromiseAnythingElse:
orig_spam = spam.func_closure[0].cell_contents
Editar: Para las funciones/métodos decoradas más de una vez y con decoradores más complicados puede intentar utilizar el siguiente código Se basa en el hecho de que las funciones decoradas son __name__d de forma diferente a la función original.
def search_for_orig(decorated, orig_name):
for obj in (c.cell_contents for c in decorated.__closure__):
if hasattr(obj, "__name__") and obj.__name__ == orig_name:
return obj
if hasattr(obj, "__closure__") and obj.__closure__:
found = search_for_orig(obj, orig_name)
if found:
return found
return None
>>> search_for_orig(spam, "spam")
<function spam at 0x027ACD70>
No es a prueba de tontos. Fallará si el nombre de la función devuelto por un decorador es el mismo que el decorado. El orden de los controles hasattr() también es heurístico, hay cadenas de decoración que arrojan resultados incorrectos en cualquier caso. solución
Si va a modificar el código para llamar a '_original', puede comentar el decorador. – eduffy
@eduffy: Ese es el punto de la pregunta. – balpha
Tienes razón ... No pensé en ello en un sentido de prueba. – eduffy