带参数的装饰器理解无非记住两点:

1.本质不过在基本的装饰器外面再封装一层带参数的函数

2.在使用装饰器语法糖的时候与普通装饰器不同,必须要加()调用,且()内的内容可以省略(当省略时,admin默认为函数is_admin声明时变量"admin")

import functools

def is_admin(admin="admin"):
def decorated(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
if kwargs.get("username")!=admin:
raise Exception("this user is not allowed to get food")
result = func(*args,**kwargs)
return result
return wrapper
return decorated @is_admin(admin="root")#这里也可以@is_admin() 此时admin默认为函数声明时定义的"admin"
def barfoo(username="someone"):
"""do crazy stuff"""
print("%s get food" % (username)) if __name__=="__main__":
barfoo(username="root")#这里调用的时候必须加上形参的名字

[注意] 如果main中调用 barfoo时不想带形参,可以使用inspect模块的getcallargs方法,该方法返回一个将参数名字和值作为键值对的字典(按照形参和实际传入参数的位置形成键值对)

代码如下:

import functools
import inspect def is_admin(admin="admin"):
def decorated(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
func_args = inspect.getcallargs(func,*args,**kwargs)
if func_args.get("username")!=admin :
raise Exception("this user is not allowed to get food")
result = func(*args,**kwargs)
return result
return wrapper
return decorated @is_admin("admin")
def barfoo(username="someone"):
"""do crazy stuff"""
print("%s get food" % (username)) if __name__=="__main__":
barfoo("admin") 上述两块代码结果都为:

  admin get food

[python 基础]python装饰器(二)带参数的装饰器以及inspect.getcallargs分析的更多相关文章

  1. Python之函数的进阶(带参数的装饰器)

    函数篇--装饰器二 带参数的装饰器 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函 ...

  2. python 装饰器 (多个参数的函数,带参数的装饰器)

    最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...

  3. Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列)

    Python进阶(七)----带参数的装饰器,多个装饰器修饰同一个函数和递归简单案例(斐波那契数列) 一丶带参数的装饰器 def wrapper_out(pt): def wrapper(func): ...

  4. Python带参数的装饰器

    在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passi ...

  5. Python 带参数的装饰器 [2] 函数参数类型检查

    在Python中,不知道函数参数类型是一个很正常的事情,特别是在一个大项目里.我见过有些项目里,每一个函数体的前十几行都在检查参数类型,这实在是太麻烦了.而且一旦参数有改动,这部分也需要改动.下面我们 ...

  6. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  7. python:带参数的装饰器,函数的有用信息

    一.带参数的装饰器,函数的有用信息 def func1(): '''此函数的功能是完成的登陆的功能 return: 返回值是登陆成功与否(true,false) ''' print(333) func ...

  8. python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结

    1.上周回顾 1).函数名的应用 直接打印函数名,是函数的地址 变量 函数的参数 函数的返回值 可以当容器类数据类型的元素 2).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...

  9. Python中带参数的装饰器

    装饰器本身是用来是为一个函数是实现新的功能,并且不改变原函数的代码以及调用方式. 遇到这样一种问题: 众多函数调用了你写的装饰器,但客户有需求说,我想实现我可以随之控制装饰器是否生效. 那你就不可能在 ...

随机推荐

  1. XML——读与写

    XML写入 private static void writeXml() { using (XmlTextWriter xml = new XmlTextWriter(@"C:\Users\ ...

  2. 如何快速获取yun2win app key?

    注册yun2win开发者账号 1.在注册页面输入您的邮箱,点击下方发送,yun2win将会发送一封验证邮件到您的邮箱: 2.如果没有收到邮件请查看垃圾箱或者点击重新发送: 3.打开邮箱查看验证邮件,点 ...

  3. 解决Mysql Workbench的Error Code: 1175错误

    错误: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE ...

  4. Python培训时长多久可以学会?马哥教育9年经验之谈

    在Python成为一门炙手可热的语言之后,很多人也开始准备向这个行业发展.技术入行也就是培训和自学两条路,各有优劣,不过培训因为学习比较系统比较快也受到不少人欢迎. 今天我就来给大家分享一下Pytho ...

  5. Xcode 插件因为UUID原因不能使用解决办法

    Xcode 经常因为一些原因不能使用,需要重新在  ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins目录下对每一个插件包下的p ...

  6. enote笔记语言(3)

    what&why(why not)&how&when&where&which:紫色,象征着神秘而又潜蕴着强大的力量,故取紫色. key&key-memo ...

  7. Yii2开发技巧 使用类似闭包的方式封装事务

    在控制器中执行事务的时候,一般的代码如下: $transaction = Yii::$app->db->beginTransaction(); try { //一些业务代码 $transa ...

  8. 如何在docker和宿主机之间复制文件

    如何在docker和宿主机之间复制文件   最近在用Docker布署hadoop,要将文件上传到HDFS首先文件得在Docker容器中吧,网上提供的方法差不多有三种 1.用-v挂载主机数据卷到容器内  ...

  9. linux修改mysql表结构

    增加字段: alter table [tablename] add [字段名] [字段类型] first(首位); alter table [tablename] add [字段名] [字段类型] a ...

  10. 刷新PHP缓冲区

    为你的站点加速_php技巧 在当前 PHP 版本的默认配置下,“输出缓冲(Output Buffering)”是被打开的.旧版本则不是这样,在旧版本的 PHP 中,字符串在每次被输出的时候(通过 ec ...