Seite 1 von 1
algemeine funktiosweise von dekoratoren
Verfasst: Sonntag 14. Oktober 2007, 23:33
von Costi
ohh mann!!
ich versuch schon seit einer stunde rauszufinden wie das mit den dekoratoren klappt.
ich brauch sowas aenliches wie cherrypy.expose:
Code: Alles auswählen
@extends('base')
def render(user):
yield "helo, " + user
#extends treagt nun render irgendwo ein und sorgt dafuer dass render.extends = "base" ist
wie geht sowas?
und wieso funktionieren dekoratoren nicht einfach so:
Code: Alles auswählen
def extends(function, arg):
function.extends = arg
manager.append(function)
danke
Re: algemeine funktiosweise von dekoratoren
Verfasst: Sonntag 14. Oktober 2007, 23:43
von Leonidas
Costi hat geschrieben:und wieso funktionieren dekoratoren nicht einfach so:
Code: Alles auswählen
def extends(function, arg):
function.extends = arg
manager.append(function)
Weil sie so einfacher funktionieren:
Code: Alles auswählen
>>> funcs = list()
>>> def extends(function):
... funcs.append(function)
... return function
...
>>> @extends
... def myfunc():
... print 'myfunc'
...
>>> funcs
[<function myfunc at 0x2ad6245ee9b0>]
>>> myfunc()
myfunc
>>>
Verfasst: Sonntag 14. Oktober 2007, 23:47
von Costi
extends what?
extends soll noch ein argument dazu bekommen....
Verfasst: Montag 15. Oktober 2007, 00:09
von Joghurt
wendet das Ergebnis von irgendwas auf bar an; in deinem Beispiel wird also "render = extends('base')(render)" ausgeführt.
Also musst du eine Funktion zurückgeben, die als Parameter die erwartete Funktion nimmt. Beispiel:
Code: Alles auswählen
def extends(arg):
def mark_function(func):
func.extends = arg
manager.append(func)
return func
return mark_function
Verfasst: Montag 15. Oktober 2007, 00:15
von Costi
thx,
ich es klappt, ich finde nur etwas komisch das die dekorierte methode dan zu None wird:
Code: Alles auswählen
>>> def extends(arg):
def mark_function(func):
func.extends = arg
manager.append(func)
return mark_function
>>> @extends('test')
def test():
pass
>>> print test
None
>>>
Verfasst: Montag 15. Oktober 2007, 00:21
von Joghurt
Du warst zu schnell

Ich hatte das "return" in der inneren Methode vergessen und noch nachträglich korrigiert
Verfasst: Montag 15. Oktober 2007, 00:38
von Costi
aso, ok

Verfasst: Montag 15. Oktober 2007, 16:48
von Leonidas
Costi hat geschrieben:extends what?
extends soll noch ein argument dazu bekommen....
Aslo das klingt ein wenig wie eine Einkaufsliste. Nur mal so: selbst ausprobieren tut nicht weh und kompliziert es es auch nicht.