Decorator abhängig von Objektzustand

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
FlaShG
User
Beiträge: 2
Registriert: Freitag 2. Mai 2014, 22:11

Hallo ihr!

Ich versuche gerade, einem Decorator an einer Funktion in einer Klasse eine Precondition zu geben, die vom Zustand einer Instanz der Klasse abhängt.
Decorators und self sind ja gefühlt aus unterschiedlichen Universen, darum würde es mich nicht wundern, wenn das Ganze überhaupt nicht geht...

Aber hier wäre erst einmal der mit hohen Quarkanteil versehene Pseudocode:

Code: Alles auswählen

class Class():
    def checkDecoratorPrecondition(self):
        return True

    @someDecorator(precondition=checkDecoratorPrecondition)
    def foo(self):
        pass
Wäre es irgendwie möglich, so etwas umzusetzen?
Meine Bauchregion tendiert momentan eher zu nein :|

Vielen Dank schon einmal!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du musst einfach wrappen:

Code: Alles auswählen

def someDecorator(func, precondition=lambda s: True):
    def wrapper(self, *args, **kwds):
        if precondition(self):
            return func(*args, **kwds)
    
    return wrapper
Bei der Gelegenheit könntest du auch einen Blick auf PEP8 werfen. Dann sieht dein Code auch nach Python aus und nicht nach Java.
Das Leben ist wie ein Tennisball.
FlaShG
User
Beiträge: 2
Registriert: Freitag 2. Mai 2014, 22:11

Ich wollte gerade schon posten:
Wie das halt so ist - kaum, dass man sich wo registriert und postet, wird einem von woanders geholfen :wink:

Unsere Lösung: Manuell dekorieren.

Code: Alles auswählen

class Class():
    def checkDecoratorPrecondition(self):
        return True

    def foo(self):
        def inner():
            pass
        return someDecorator(precondition=checkDecoratorPrecondition)(inner)()
Finde ich in diesem Falle auch angenehmer, da ich am decorator selbst nicht rumpfuschen wollte.

Der Beispielcode war nur so hingekotzt, mein eigentlicher Code sieht da schon ganz anders aus.
Hab nur heute tatsächlich den ganzen Tag Java gemacht.
Antworten