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

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. 6 个 Linux 运维典型问题,大牛的分析解决思路在这里

    作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...

  2. 表单enctype属性传值问题

    form表单的enctype设置为multipart/form-data后,表单中除了文件后台能拿到,其他值后台都拿不到. 知识点: 一.application/x-www-form-urlencod ...

  3. Vue和JQuery相比,除了节省了开发成本,还有什么优点?

    1.模块化,变量都是私有作用域,JQuery只能用全局变量.闭包,影响性能 2.组件化 3.因为1,所以方便维护 vuex 要注意刷新清空的问题 vue-router是局部刷新,window.loca ...

  4. koji

    fedora koji https://koji.fedoraproject.org/koji/ centos cbs.centos.org/koji/

  5. JS练习:定时弹出广告

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  6. PAT 1118 Birds in Forest

    Some scientists took pictures of thousands of birds in a forest. Assume that all the birds appear in ...

  7. Java基础之构造方法及其应用

    构造方法是一种特殊的方法,它是一个与类同名且无返回值类型(连void也不能有)的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会自动调用构造方法.构造方 ...

  8. MapReduce Shuffle优化方向

    Shuffle过程介绍可以查看该博客:http://langyu.iteye.com/blog/992916 优化方向: 压缩:对数据进行压缩,减少写读数据量: 减少不必要的排序:并不是所有类型的Re ...

  9. Spring MVC-表单(Form)标签-文件上传(File Upload)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_upload.htm 说明:示例基于Spring MVC 4.1.6. 以下示例显 ...

  10. PKU 2774 Long Long Message (后缀数组练习模板题)

    题意:给你两个字符串.求最长公共字串的长度. by:罗穗骞模板 #include <iostream> #include <stdio.h> #include <stri ...