从函数装饰器访问函数参数

Ada*_*jen 10 python

如果我有一个看起来像这样的函数:

@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变量?

Ana*_*mar 8

包装函数的位置参数来自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.routeid作为位置参数还是关键字参数发送args,kwargs并获取正确的值.我认为它可能会作为位置论证进入,如果是这样,它将是第一个元素args.