我有一个基于类的装饰器。问题是我需要能够访问包装函数 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 视为字典。
附言我不知道为什么它的 args 和 kwargs 看起来像那样。为什么他们看起来像那样?
如答案中所述,args
是 pdb 的命令。用户 repr(args)
查看参数。
下一个问题是可能的函数签名: 1) def fn(请求, ...) 2) def fn(self, a, b, c, etc, 用户) 3) def fn(用户)
有没有一种方法可以用一个装饰器来处理所有这些问题?
最佳答案
您的 pdb
输出并不真正相关,args
这里的行为类似于交互式 pdb 命令。
为了简单起见,要么使用repr(args)
,要么临时重命名*args
参数
关于python - 在装饰器的包装器中访问 kwargs 和 args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54634702/