algemeine funktiosweise von dekoratoren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Sonntag 14. Oktober 2007, 23:33

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
cp != mv
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 14. Oktober 2007, 23:43

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
>>> 
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Sonntag 14. Oktober 2007, 23:47

extends what?

extends soll noch ein argument dazu bekommen....
cp != mv
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 15. Oktober 2007, 00:09

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
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 15. Oktober 2007, 00:15

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
>>> 
cp != mv
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 15. Oktober 2007, 00:21

Du warst zu schnell ;-) Ich hatte das "return" in der inneren Methode vergessen und noch nachträglich korrigiert
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 15. Oktober 2007, 00:38

aso, ok :lol:
cp != mv
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 15. Oktober 2007, 16:48

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten