Warum sind die folgenden beiden Skripte nicht gleichwertig?
(Aus einer anderen Frage: Python-Dekorierer verstehen )
%Vor%und mit einem dekorierten Dekorateur:
%Vor% Warum möchte ich es wissen? Ich habe einen retry
decorator geschrieben, um MySQLdb-Exceptions abzufangen - wenn die Exception vorübergehend ist (z. B. Timeout), wird sie die Funktion nach dem Einschlafen erneut aufrufen.
Ich habe auch einen modifies_db
Decorator, der sich um einige cache-bezogene Housekeeping kümmert. modifies_db
ist mit retry
dekoriert, also nahm ich an, dass alle mit modifies_db
dekorierten Funktionen auch implizit wiederholen würden. Wo bin ich falsch gelaufen?
Das Problem mit dem zweiten Beispiel ist das
%Vor% versucht, makeitalic
, den Dekorator, und nicht wrapped
, die Funktion, die es zurückgibt, zu dekorieren.
Sie können tun, was ich denke, Sie beabsichtigen mit etwas wie diesem:
%Vor% Hier verwendet makeitalic
makebold
, um wrapped
zu dekorieren.
Der Grund dafür ist, dass wrapped () innerhalb von makebold keine Argumente akzeptiert.
Wenn du den Dekorateur so verwendest, kann das einige Probleme verursachen, ich werde ein Beispiel veröffentlichen, wie du das erreichen kannst, was du willst, aber gib mir nur einen Moment.
Hier ist ein funktionierendes Beispiel für das, was Sie brauchen.
%Vor% makebold
ist irgendwie hässlich, aber es zeigt Ihnen, wie man einen Dekorator schreibt, der optional einen anderen Dekorator umschließen kann.
Hier ist die Ausgabe aus dem obigen Skript:
%Vor% Beachten Sie, dass makebold der einzige rekursive Dekorator ist. Beachten Sie auch den feinen Unterschied in der Verwendung: @makebold()
vs @makeitalic
.