Ist es möglich, zu ersetzen, eine Funktion/Methode decorator zur Laufzeit? [ python ]
Wenn ich eine Funktion haben :
@aDecorator
def myfunc1():
# do something here
if __name__ = "__main__":
# this will call the function and will use the decorator @aDecorator
myfunc1()
# now I want the @aDecorator to be replaced with the decorator @otherDecorator
# so that when this code executes, the function no longer goes through
# @aDecorator, but instead through @otherDecorator. How can I do this?
myfunc1()
Ist es möglich, zu ersetzen, einem Dekorateur bei der Laufzeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, ob es einen Weg gibt, um "ersetzen", "decorator", sobald es angewandt wurde, aber ich denke, dass wahrscheinlich es nicht, weil die Funktion wurde bereits geändert.
Kann man, eh, tragen Sie eine Dekorateurin zur Laufzeit basierend auf einer Bedingung:
Als Miya erwähnt, können Sie ersetzen Sie den Dekorator mit einer anderen Funktion einem beliebigen Punkt vor der interpreter ruft die Funktion Erklärung. Allerdings, wenn der decorator wird angewendet auf die Funktion, ich glaube nicht, dass es eine Möglichkeit dynamisch ersetzen Sie den Dekorator mit einem anderen. So zum Beispiel:
Wird nicht funktionieren, weil myfunc1 nicht mehr die Funktion, die Sie ursprünglich definiert; es ist bereits verpackt. Der beste Ansatz ist hier, um manuell anwenden Dekorateure, oldskool-Stil, ich.e:
Edit: Oder um es ein wenig klarer,
Hier ist eine tolle Rezept zum Einstieg. Grundsätzlich, die Idee ist, übergeben Sie eine Instanz der Klasse in den Dekorateur. Sie können dann festlegen, dass die Attribute, die auf die Instanz der Klasse (die machen es einem Borg, wenn Sie mögen) und verwenden, um das Verhalten der Dekorator selbst.
Hier ein Beispiel:
Natürlich können Sie auch enthalten die "Dekorateur Dekorateur" zu bewahren, Signaturen, etc.
Sicher - Sie können die function-Objekt, und tun, was Sie will:
def aDecorator(f): return lambda *args, **kwargs: "HAHAHAHAHAHAHA"
. Im Allgemeinen ist dies nicht in der Nähe ein Gültiger Ansatz. Wenn Sie do passieren die Kontrolle der erste Dekorator, dann gibt es Reiniger, mehr idiomatische Möglichkeiten, dies zu tun.Wenn Sie wollen ausdrücklich die änderung der Dekorateur, könnte man genauso gut wählen Sie einen expliziten Ansatz anstelle der Erstellung einer verzierten Funktion:
deco1() und deco2() für die Funktionen, die Ihre Dekorateure bieten und rufen myfunc1() mit den Argumenten.
Ich weiß, es ist ein Alter thread, aber ich hatte Spaß dabei
Wenn der decorator ist eine Funktion, nur ersetzen.