2015-09-08 14 views
9

Wenn ich eine Funktion, die wie folgt aussieht:Zugriffsfunktion Argumente von Funktions Dekorateur

@app.route('/categories/id/<int:id>/edit') 
@login_required 
def edit_category(id): 
    #some code... 

Und der login_required Dekorateur sieht aus wie dieses

def login_required(f): 
    @wraps(f) 
    def wrapper(*args, **kwargs): 
     print id #given to edit_category by app.route decorator 
     return f(*args, **kwargs) 
    return wrapper 

Wie kann ich die ID-Variable zugreifen, die gegeben ist edit_category als Argument von app.route decorator vom login_required decorator?

Antwort

6

Die Positions Argumente an die Wrapper-Funktion in der args (erste Argument - *args) kommen, und das Schlüsselwort Argumente für das Verfahren kommen in kwargs (zweites Argument - **kwargs).

args ist ein Tupel, wobei sich das erste Element auf das erste Positionsargument bezieht, das zweite Element das zweite Positionsargument.

kwargs ist ein Wörterbuch, in dem der Schlüssel das Schlüsselwort (für das Argument) ist und der Wert der für dieses Schlüsselwort übergebene Wert ist.

Beispiel -

>>> def decor(func): 
...  def wrapper(*args, **kwargs): 
...    print('args - ',args) 
...    print('kwargs - ',kwargs) 
...    return func(*args, **kwargs) 
...  return wrapper 
... 
>>> @decor 
... def a(*a, **b): 
...  print("In a") 
...  print(a) 
...  print(b) 
... 
>>> a(1,2,x=10,y=20) 
args - (1, 2) 
kwargs - {'y': 20, 'x': 10} 
In a 
(1, 2) 
{'y': 20, 'x': 10} 

können Sie testen, ob app.route wird id als Positions Argument oder Keyword-Argument das Senden von sowohl Druck args und kwargs und nehmen Sie den richtigen Wert. Ich denke, es könnte als Positionsargument hereinkommen, wenn ja, wäre es das erste Element von args.

+0

große antwort, danke :) –