python - 在装饰器的包装器中访问 kwargs 和 args

标签 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 视为字典。

附言我不知道为什么它的 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/

相关文章:

python - 如何像这样在 "|"中每隔5插入 "-"?

python - 用 chalice 处理路线

python - 传递类变量时类对象中的装饰器

java - 如果在代理模式中,我们在代理类中有接口(interface)而不是实际的具体主题,它是否等同于装饰器模式

javascript - 带有 babel 的装饰器,意想不到的 token

python - 获取每月数据库的每日平均值

python - 使用 atexit 终止线程时脚本卡在退出处

python - 当一只正在移动的 Python turtle 靠近另一只 turtle 时,阻止它

Python - 在 Mac 上安装 opencv 时遇到问题(几个月前 opencv 运行良好之后)

python - 从元组列表创建嵌套字典的快速方法,无需 for 循环