Seite 1 von 1

Funktion zu einem Dictionary adden mit Hilfe von Decorators

Verfasst: Freitag 18. September 2020, 11:56
von aaronlyy
Hallo,
ich möchte Funktionen zu einerm Dictionary hinzufügen mit Hilfe von Decorators:
Ich habe eine Klasse erstellt und dieser eine Funktion hinzugefügt die 'add' heißt.
Nun würde ich diese Funktion gerne als Decorator über eine Funktion schreiben, das die Funktion zu einem Dictionary was in __init__ erstellt wurde hinzugefügt wird.
Der add Funktion/decorator soll dabei der key als Argument übergeben werden.

Ich möchte das es ungefähr so funktioniert wie das routing in Flask, dort wird auch die funktion zu der übergebenen route gemappt:

Code: Alles auswählen

@app.route('/')
def hello_world():
    return 'Hello, World!'
Hier ist mein Code:

Code: Alles auswählen

class App:
def __init__(self):
    self.functions = {}

def add(self, key, func):
    self.functions[key] = func

app = App()

@app.add("hello")
def print_hello():
    print("hello")
Hier ist der Error:

Code: Alles auswählen

@app.function("hello")
TypeError: function() missing 1 required positional argument: 'func'
Hier ist ein funktionierender Code bei dem die Funktion nur zu einer Liste hinzugefügt wird:

Code: Alles auswählen

class App:
def __init__(self):
    self.functions = []

def add(self, func):
    self.functions.append(func)

def loop_functions(self):
    for f in self.functions:
        f()

app = App()

@app.add
def print_hello():
    print("hello")

app.loop_functions()
Danke :)

Re: Funktion zu einem Dictionary adden mit Hilfe von Decorators

Verfasst: Freitag 18. September 2020, 14:37
von narpfel
Moin,

Code: Alles auswählen

@foo
def bar():
    ...
ist das gleiche wie

Code: Alles auswählen

def bar():
    ...

bar = foo(bar)
Deshalb funktioniert das zweite Beispiel. Wenn im Decorator ein Aufruf steht, verändert sich nicht magisch die Semantik:

Code: Alles auswählen

@foo()
def bar():
    ...
wird zu

Code: Alles auswählen

def bar():
    ...

bar = foo()(bar)
entzuckert.

Re: Funktion zu einem Dictionary adden mit Hilfe von Decorators

Verfasst: Freitag 18. September 2020, 14:51
von Sirius3
Solche Pattern löst man üblicherweise mit verschachtelten Funktionen. Add braucht noch einen Rückgabewerte, die dekorierte Funktion:

Code: Alles auswählen

class App:
    def __init__(self):
        self.functions = {}

    def add(self, key):
        def inner(func):
            self.functions[key] = func
            return func
        return inner

app = App()

@app.add("hello")
def print_hello():
    print("hello")