说说 Python 装饰器「参数」的那些事儿。_python 装饰器 参数

42 阅读4分钟

00.获取函数参数

在上一篇的最后,我写了一个装饰器的例子。为了方便,我把它拿过来给你看:

接下来我们来使用一下上述定义的 Stack 类,在用的过程中我发现了一件很奇怪的事,当我向下面这样调用的时候程序是正常的:

 

而当我像下面这样调用的时候,程序就会报错:

你可能会生成“这怎么会出错”的疑问,因为按照我们理解的,「关键字参数」会根据名字进行匹配,而「位置参数」会根据参数所在的顺序进行匹配,既然这样的话,admin 明明是穿进了 username 变量,那为啥会出错呢?

其实上面我们怀疑的原因都没有问题,有问题的是我们的装饰器写的有问题。问题就是出现在装饰器的参数传递上

在 check_admin 这个装饰器中,我直接从 kwargs.get 中获得了 username 这个值。第一个正确是因为我用的是关键字参数传递的 username,那么 username 的变量以及值理应在 kwargs 中,第二个错误是因为我们用位置参数传递的 username,那么 username 的值出现在 args 中。

那么新的问题来了,作为用户来讲,无论使用位置参数或者是关键字参数都是对的,这个我们是无法去控制的,那这个问题应该怎么解决呢?Python 说:“用 inspect 模块”。其中的 getcallargs 可以解决这个问题,它返回的是一个字典,这个字典里保存了函数的所有参数。加下来我们看该怎么改:

 

01.带参数的装饰器

在我们之前熟知的装饰器语法中,外层函数的参数是被装饰的函数,内层函数的参数是被装饰的函数的参数。但是有些时候我们想针对不同的函数装饰器有些变化怎么办,即给装饰器后面带上相应的参数。

比如有个针对加和减的装饰器如下所示:

 

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

了解详情:docs.qq.com/doc/DSnl3ZG…