Seite 1 von 1

Decorator mit zwei parametern

Verfasst: Montag 30. November 2009, 17:13
von conloos
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

Verfasst: Montag 30. November 2009, 17:18
von DasIch

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

Verfasst: Montag 30. November 2009, 22:42
von conloos
Danke

Verfasst: Dienstag 1. Dezember 2009, 07:01
von 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