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

我介绍了学习 Python 装饰器的必备知识以及其最最基本的概念。既然是基本的知识点,那就是还有不基本,因为当时的考虑是篇幅已经够长以及里面涉及的知识点已经很多,写的再多了势必会影响大家的理解。所以剩下的那些留到今天来写,如果你没有看过之前的那篇文章,建议看过了再回来呦。

00.获取函数参数

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

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

 

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

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

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

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

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

 

01.带参数的装饰器

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

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

 

但这个时候我想做点改变,想把函数的名字也给打出来,这个时候我们装饰器肯定就是要带上参数了,参数传的就是函数的名字,这个时候我们该怎么办?其实也简单的很,那就再嵌套一层函数呗。具体如下所示:

其实这么来看,装饰器写起来还是套路满满呢。

今天就到这里就结束啦,不知道你学会了没呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值