如果我有一个看起来像这样的函数:
@app.route('/categories/id/<int:id>/edit')
@login_required
def edit_category(id):
#some code...
Run Code Online (Sandbox Code Playgroud)
login_required装饰器看起来像这样
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
Run Code Online (Sandbox Code Playgroud)
如何从login_required装饰器访问app.route装饰器给edit_category作为参数的id变量?
包装函数的位置参数来自args(第一个参数 - *args),方法的关键字参数kwargs(第二个参数 - **kwargs).
args 是一个元组,其中第一个元素引用第一个位置参数,第二个元素是第二个位置参数.
kwargs 是一个字典,其中键是关键字(对于参数),值是传递给该关键字的值.
示例 -
>>> 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}
Run Code Online (Sandbox Code Playgroud)
您可以通过打印两者来测试app.route是id作为位置参数还是关键字参数发送args,kwargs并获取正确的值.我认为它可能会作为位置论证进入,如果是这样,它将是第一个元素args.