在装饰器的包装器上访问kwargs和args

时间:2019-02-11 16:15:32

标签: python python-3.x decorator python-decorators

我有一个基于类的装饰器。问题是我需要能够访问包装函数args和kwargs,但是现在我不能,而且我不明白为什么。这应该很容易,但是对我来说不是。

class limit:
    def __call__(self, fn):
        @wraps(fn)
        # the idea to use signature like (request, *args, **kwargs) is bad. I must accept *args and **kwargs only 
        def wrapper(*args, **kwargs):
             # pdb breakpoint is here
             user = kwargs.get('user') or kwargs.get('request').user // ERROR

             return fn(*args, **kwargs)

        return wrapper

让我们看一下pdb。真是太疯狂了。

(Pdb) args
args = (<User: dua>,)
kwargs = {}
(Pdb) kwargs
{}
(Pdb) args.args
args = (<User: dua>,)
kwargs = {}
(Pdb) args.args.args.args
args = (<User: dua>,)
kwargs = {}
(Pdb) args.get('user')
args = (<User: dua>,)
kwargs = {}
(Pdb) type(args)
<class 'tuple'>
(Pdb) 

问题是我如何才能访问args,kwargs,并将args视为列表,将kwargs视为dict。

P.S。我不知道为什么它看起来像args和kwargs。他们为什么看起来像这样?


如答案args所述,是pdb的命令。用户repr(args)看到args。

下一个问题是函数的可能签名: 1)def fn(请求,...) 2)def fn(自己,a,b,c等用户) 3)def fn(用户)

有没有办法用一个装饰器来处理所有这些?


2 个答案:

答案 0 :(得分:1)

您的pdb输出与实际无关,args的作用类似于交互式pdb命令。

为简单起见,请使用repr(args)或临时重命名*args参数

答案 1 :(得分:0)

我最终得到了这个解决方案:

sendData