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.
Costi
User
Beiträge: 545 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
Python-Forum Veteran
Beiträge: 16025 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 (former) Modvoice
Joghurt
User
Beiträge: 877 Registriert: Dienstag 15. Februar 2005, 15:07
Montag 15. Oktober 2007, 00:09
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: 545 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: 545 Registriert: Donnerstag 17. August 2006, 14:21
Leonidas
Python-Forum Veteran
Beiträge: 16025 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 (former) Modvoice