2

Ich möchte zu definieren, für die Bar-Funktion, um den Standardwert auf den Parameter param2:Wie kann ich einen Standardwert für einen Funktionsparameter mit einem Decorator festlegen?

def foo(default_value): 
    def bar(param1, param2=default_value) 
     """bar does some stuff""" 
    return bar 
bar = foo(default_value) 

Wie dies mit Dekorateure möglich wäre?

Mehr global, wenn jemand eine Dokumentation darüber hat, wie wir Args und Kwargs manipulieren können, wenn wir eine Funktion mit Argumenten dekorieren, würde ich mich freuen, einen Blick darauf zu werfen.

+0

Die Verwendung sollte unbedingt in Betracht ziehen ** ** ** ** Wrapping ** (http://wrapt.readthedocs.org/en/latest/) 'Das Ziel des Wrapt-Moduls ist es, einen transparenten Objekt-Proxy für Python, das als Grundlage für die Konstruktion von Funktionswrappern und Decorator-Funktionen verwendet werden kann. – craigsparks

Antwort

1

Die Syntax Für Dekorateure mit Argumenten ist das anders. Es sollte eine Funktion zurückgeben, die eine Funktion übernimmt und eine andere Funktion zurückgibt. Zum Beispiel:

def foo(default_value): 
    def wrapped(f): 
     def bar(param1, param2=default_value): 
      print "inside bar" 
      print "param1=%s param%s"%(param1, param2) 
     return bar 
    return wrapped 

Nun, wenn Sie eine Funktion dekorieren:

@foo(default_value="test param2") 
def test_decorator(): 
    pass 

aufrufen es bewirkt:

test_decorator("test param1") 

inside bar 
param1=test param1 param2=test param2 

Alternativ mit den Standardwert akzeptieren:

test_decorator("test param1", "other test param2") 

inside bar 
param1=test param1 param2=other test param2 

Sie können mehr lesen e zum Thema here

+0

Ich hätte gerne gesehen, wie man param2 mit den Argumenten * und * kwargs kombiniert, aber trotzdem, Sie sind die Lösung, obwohl spezifisch, funktioniert – Jacquot

0

Ich bin nicht sicher, ob ich verstehe, was Ihr Beispielcode bedeutet, aber das scheint folgendes zu tun, was, was der Titel Ihrer Frage stellt:

PLACE_HOLDER = object() 

def default_arg(default_value): 
    def decorator(f): 
     if f.func_defaults and f.func_defaults[0] is PLACE_HOLDER: 
      f.func_defaults = (default_value,) 
     return f 
    return decorator 

@default_arg(42) 
def bar(param1, param2=PLACE_HOLDER): 
    """bar does some stuff""" 
    print('bar({}, {}) called'.format(param1, param2)) 


bar(1) 

Ausgang:

bar(1, 42) called