Siehe, FuglyHackThatWillWorkForYourExampleButICantPromiseAnythingElse:
orig_spam = spam.func_closure[0].cell_contents
Bearbeiten : Für Funktionen / Methoden, die mehrmals dekoriert wurden und mit komplizierteren Dekoratoren können Sie versuchen, den folgenden Code zu verwenden. Es beruht auf der Tatsache, dass dekorierte Funktionen __name__d anders sind als die ursprüngliche Funktion.
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>
Es ist jedoch kein Kinderspiel. Es schlägt fehl, wenn der Name der von einem Dekorateur zurückgegebenen Funktion mit dem Namen der dekorierten Funktion übereinstimmt. Die Reihenfolge der hasattr () - Prüfungen ist ebenfalls eine Heuristik. Es gibt Dekorationsketten, die auf jeden Fall falsche Ergebnisse liefern.
_originalSie den Dekorateur auch kommentieren.