Decorator mit zwei parametern

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
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

Hallo,

ich bin auf folgendes gestoßen:

Code: Alles auswählen

def wrap_setup(func, plugin):
    """Decorator that ensures that the :meth:`hornet.plugin.Plugin.setup`
    method performs certain actions even if overridden. The setup 
    actions include registering plugins.
    """
    @wraps(func)
    def new():
        for announcers in plugin.listen_to:
            announcers.register(plugin)
        logger.debug('Plugin, "%s", setup' % plugin.id)
        func()
    return new
Wie kann man mehrere Parameter an diesen Dekorator übergeben?
Wenn ich damit eine Funktion dekoriere, bekomme ich immer ein:

wrap_setup() takes exactly 2 arguments (1 given)

Alle Beispiele die ich finden kann, sind immer mit einem Parameter, der Funktion die ich halt dekorieren will.


Danke Con
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

def do_something_with(whatever):
    pass

def some_func(decorator_arg1, decorator_arg2):
    def decorator(func):
        @wraps(func)
        def wrapper(func_arg1, func_arg2):
            rv = func(func_arg1, func_arg2)
            do_something_with(rv)
            return rv
        return wrapper
    return decorator

@some_func(1, 2)
def foo(a, b):
    return a + b
conloos
User
Beiträge: 22
Registriert: Freitag 23. November 2007, 09:54

Danke
lunar

Mit dem decorator-Modul lässt sich das auch kürzen:

Code: Alles auswählen

def do_something_with(whatever):
    pass

@decorator_factory
def some_func(decorator_arg1, decorator_arg2, func, func_arg1, func_arg2):
    rv = func(func_arg1, func_arg2)
    do_something_with(rv)
    return rv

@some_func(1, 2)
def foo(a, b):
    return a + b
Antworten