【发布时间】:2019-02-11 16:15:31
【问题描述】:
我有一个基于类的装饰器。问题是我需要能够访问包装函数 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。
附:我不知道为什么它 args 和 kwargs 看起来像那样。为什么它们看起来像那样?
正如答案args 中提到的,是pdb 的命令。用户repr(args) 查看参数。
下一个问题是可能的函数签名: 1) def fn(请求, ...) 2) def fn(self, a, b, c, etc, user) 3) 定义 fn(用户)
有没有办法用一个装饰器来处理所有这些问题?
【问题讨论】:
标签: python python-3.x decorator python-decorators