in diesem fall wird beim aufruf einer beliebigen funktion, die nach dem dekorator genannt wird, erst der dekorator aufgerufen,
jein, das stimmt so nicht ganz. es wird nicht "erst" der dekorator, sondern _nur_ die funktion, die der dekorator zurückgibt, aufgerufen.
man stelle sich vor, man riefe diesen dekorator von hand auf
Code: Alles auswählen
def innocentFunction(a, b, c):
print a, b, c
# punkt 1
innocentFunction= permissionRequired(innocentFunction)
# punkt 2
man sieht hier: bei punkt 1 ist an den Namen "innocentFunction" eine Funktion gebunden, die a, b, c ausgibt (logisch).
Allerdings wird dieser name nach punkt 1 neu gebunden, und zwar an das resultat der funktion permissionRequired, die auch eine funktion zurückgibt.
dann überprüft, ob der user die rechte hat, und dann vom wrapper die gewünschte funktion ausgeführt...aber die funktion wird doch automatisch ausgeführt, wenn man sie für einen aufruf benutzt!?!
nein, weil diese funktion ja nicht mehr mit diesem namen verknüpft ist.
der name "innocentFunction" ist an den wrapper gebunden, den "permissionRequired" zurückgegeben hat, das ganze ding ist in jeder hinsicht einfach nur eine funktion.
oder wenn man dieses nicht tut, dann sind aber alle argumente in einem tuple, d.h., wenn das ganze auf etwas noch anderem basiert, muss man erstmal den kladderadatsch aus dem tuple holen...oder?
ich verstehe nicht ganz, was du hier meinst.
edit: ich bastele gerade im Pythonwiki an einer
Einführung. Anregungen oder Korrekturen sind erwünscht