Seite 1 von 1

Decorator abhängig von Objektzustand

Verfasst: Freitag 2. Mai 2014, 22:36
von FlaShG
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!

Re: Decorator abhängig von Objektzustand

Verfasst: Freitag 2. Mai 2014, 23:08
von EyDu
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.

Re: Decorator abhängig von Objektzustand

Verfasst: Freitag 2. Mai 2014, 23:13
von FlaShG
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.