Hallo,
öfters mal sehe ich ein @-Zeichen bevor eine Funktion mit def deklariert wird.
Kann mit bitte jemand ein Stichwort geben, bzw. sagen wo man das nachlesen kann?
Danke und viele Grüße.
Was bedeutet das @ vor Funktionen
-
- User
- Beiträge: 22
- Registriert: Sonntag 3. Mai 2015, 16:26
Hallo,
kann mir bitte jemand einige sinnvolle Beispiele nennen wofür man dieses wunderbare Konstrukt nun benutzt?
Vielen Dank.
kann mir bitte jemand einige sinnvolle Beispiele nennen wofür man dieses wunderbare Konstrukt nun benutzt?
Vielen Dank.
Schau dir mal in der Dokumentation functools.lru_cache an. Das sollte dir eine erste Idee geben, was mit einem Decorator möglich ist.chevallier hat geschrieben:kann mir bitte jemand einige sinnvolle Beispiele nennen wofür man dieses wunderbare Konstrukt nun benutzt?
@chevallier:
Dekoratoren sind in Python sehr mächtig. Von einfachen makroähnlichen Ersetzungen über Ereignis-/Callbackregistrierung bis zum Verketten/Einbetten von Funktionalität ist vieles denkbar. Wenn Du aus der Beschreibung der Dekoratoren nicht siehst, wofür Du diese brauchen kannst, brauchst Du wahrscheinlich keine. Am Ende sind Dekoratoren nur eine andere syntaktische Form, d.h. Du kommst für Deine Probleme auch immer ohne aus.
Dekoratoren sind in Python sehr mächtig. Von einfachen makroähnlichen Ersetzungen über Ereignis-/Callbackregistrierung bis zum Verketten/Einbetten von Funktionalität ist vieles denkbar. Wenn Du aus der Beschreibung der Dekoratoren nicht siehst, wofür Du diese brauchen kannst, brauchst Du wahrscheinlich keine. Am Ende sind Dekoratoren nur eine andere syntaktische Form, d.h. Du kommst für Deine Probleme auch immer ohne aus.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Immer dann, wenn man Verhalten zur Laufzeit modifizieren will, ohne dass der Aufrufer etwas ändern müsstechevallier hat geschrieben: kann mir bitte jemand einige sinnvolle Beispiele nennen wofür man dieses wunderbare Konstrukt nun benutzt?

Das läuft auf den Decorator-Pattern hinaus (was die Motivation angeht!) - das ist sicherlich etwas fortgeschritteneres, was Du vermutlich noch nicht im vollen Umfang verstehen wirst oder auch benötigst.
Gut Beispiele sind Handler-Funktionen bei Webframeworks, wie z.B. Flask oder Bottle. Dort werden Decoratoren für das Routing benutzt. Oder noch banaler der ``@property``-Dekorator aus der Standardlib.
Um das alles zu Verstehen solltest Du mal googlen - das wäre übrigens eigentlich der erste Schritt, anstatt hier etwas allgemeines nachzufragen

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 22
- Registriert: Sonntag 3. Mai 2015, 16:26
Nein, ich brauche keine, von mir aus kann man sie abschaffen, aber man trifft oft auf sie wenn man Code lesen möchte, den man verstehen will.jerch hat geschrieben:Wenn Du aus der Beschreibung der Dekoratoren nicht siehst, wofür Du diese brauchen kannst, brauchst Du wahrscheinlich keine.
Google? Was ist das?Hyperion hat geschrieben:Um das alles zu Verstehen solltest Du mal googlen - das wäre übrigens eigentlich der erste Schritt, anstatt hier etwas allgemeines nachzufragenDenn Anwendungsbeispiele werden eigentlich immer in Tutorials genannt und umrissen, die Dekoratoren in Python erklären...
Ich habe schon verstanden, dass, wenn ich ein Problem habe, ich nur im Notfall hier im Forum fragen darf aber stell dir vor ich treffe nur auf Beispiele a la:
Code: Alles auswählen
def wrapfunc(func):
def innerfunc():
return func() + 1
return innerfunc
@wrapfunc
def funcy():
return 3
print(funcy())
Und bezüglich des Handbuches: Ganz ehrlich, meine Englischkenntnisse sind gut bis sehr gut, trotzdem verstehe ich kaum etwas, weil es zu technisch ist, zB.:
@staticmethod taucht oft auf.
Ich versuche schon einige Zeit herauszufinden wozu man das Ding gebraucht, laut Handbuch:
"Return a static method for function." - Toll.
Python ist nicht schwer, nur schlecht dokumentiert. Z.B. ist die Syntax von PHP viel unübersichtlicher, man lernt es trotzdem leichter, weil das Manual viel besser aufgebaut und verständlicher ist.
Wenn ich was suche, dann meide ich das Handbuch, es kann ruhig auf englisch sein, aber nur nicht das Handbuch, am besten irgend ein Geek-Blog, etc.
Ich danke Euch für Eure Mühen.
Dekoratoren sind, wie oben bereits genannt lediglich syntaktischer Zucker für Funktionen höherer Ordnung (higher-order functions). In Kürze: Funktionen höherer Ordnung sind Funktionen welche Funktionen als Parameter entgegen nehmen und/oder eine Funktion als Rückgabewert haben.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Unsinn! Das hat nichts mit "Notfall" oder "bitte nur selten fragen" zu tun, sondern mit der *Methodik*! Du stellst die Frage "was bedeutet das @..." So etwas könnte man imho auch selber *schneller* herausfinden, indem man googelt. Ok sei's drum. Dann bekommst Du als Antwort das Stichwort "Dekorator" und postest dann eine ziemlich "genervt" wirkende Bitte um Beispiele, ohne wenigstens kurz zu benennen, *was* Du Dir jetzt angeguckt hast oder welches Tutorial dazu Dir keine sinnvollen Beispiele genannt hat. Das würde ich schon erwarten...chevallier hat geschrieben: Ich habe schon verstanden, dass, wenn ich ein Problem habe, ich nur im Notfall hier im Forum fragen darf ...
Also Du könntest bei so etwas immer googeln, da wird man bei "sense of staticmethod in python" fündig! Zudem kannst und solltest Du auch die Suchfunktion dieses Forums nutzen. Da findet man zur Suche "staticmethod sinn" das folgende Thema: http://www.python-forum.de/viewtopic.ph ... ethod+sinnchevallier hat geschrieben: Und bezüglich des Handbuches: Ganz ehrlich, meine Englischkenntnisse sind gut bis sehr gut, trotzdem verstehe ich kaum etwas, weil es zu technisch ist, zB.:
@staticmethod taucht oft auf.
Ich versuche schon einige Zeit herauszufinden wozu man das Ding gebraucht, laut Handbuch:
"Return a static method for function." - Toll.
Python ist nicht schwer, nur schlecht dokumentiert. Z.B. ist die Syntax von PHP viel unübersichtlicher, man lernt es trotzdem leichter, weil das Manual viel besser aufgebaut und verständlicher ist.
Wenn ich was suche, dann meide ich das Handbuch, es kann ruhig auf englisch sein, aber nur nicht das Handbuch, am besten irgend ein Geek-Blog, etc.
Und das kann man auch ohne Englischkenntnisse verstehen.
Grundsätzlich scheint Dein Verständnisproblem *inhaltlicher* Natur zu sein! Wäre das alles auf deutsch, würdest Du die Doku offenbar auch nicht kapieren, weil Dir vermutlich noch das Verständnis von vielen Basis-Konzepten fehlt. Solche werden in der Doku natürlich nicht an jeder Stelle bis ins kleinste erklärt, sondern *vorausgesetzt*. (Im Tutorial natürlich schon - ich beziehe mich auf die Library- und Language-Sektionen) Solche Dinge muss man eben durch Tutorials lernen und teilweise auch über die Grenzen *eines* Buches hinaus Querrecherche betreiben.
Übrigens eigent man sich so etwas auch nicht alles über Nach an! Man muss da auch ein wenig Geduld haben. Zudem wird das Verständnis für manche Themen auch erst geweckt bzw. *nachhaltig* im Kopf hinterlegt, wenn man darüber in seinem eigenen Code stolpert (Stichworte Zeitkomplexität, Unit Testing, Lose Kopplung, uvm).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
-
- User
- Beiträge: 22
- Registriert: Sonntag 3. Mai 2015, 16:26
Hast schon Recht Hyperion, war ein wenig genervt vom ganzen Kram - ich weiß du nimmst es nicht persönlich.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Richtigchevallier hat geschrieben:ich weiß du nimmst es nicht persönlich.

encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert