我有一个基于类的装饰器。问题是我需要能够访问包装函数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(用户)
有没有办法用一个装饰器来处理所有这些?
答案 0 :(得分:1)
您的pdb
输出与实际无关,args
的作用类似于交互式pdb命令。
为简单起见,请使用repr(args)
或临时重命名*args
参数
答案 1 :(得分:0)
我最终得到了这个解决方案:
sendData