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

Code: Alles auswählen

@irgendwas
def bar():
    pass
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 :lol:

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.