函数闭包带参数装饰器

import time
users_dic = [{‘name‘:‘zsz‘,‘passwd‘:‘123‘},
            {‘name‘:‘alex‘,‘passwd‘:‘123‘},
            {‘name‘:‘lhf‘,‘passwd‘:‘123‘}]
current_dic = {"username":None,"Login":False}
def auth(auth_type=‘filedb‘):
    def auth_func(func):
        def wrapper(*args,**kwargs):
            print("认证方式是:",auth_type)
            if auth_type == ‘filedb‘:
                if current_dic["username"] and current_dic["Login"]:
                    res = func(*args,**kwargs)
                    return res
                username = input("用户名:").strip()
                passwd = input("密码:").strip()
                for user_dic in users_dic:
                    if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:
                        current_dic["username"] = username
                        current_dic["Login"] = True
                        res = func(*args, **kwargs)
                        return res
                else:
                    print("用户名或者密码错误")
            elif auth_type == ‘ldap‘:
                start_time = time.time()
                res = func(*args,**kwargs)
                stop_time = time.time()
                print("函数运行时间为%s秒" %(stop_time-start_time))
                return res
        return wrapper
    return auth_func

@auth(auth_type=‘filedb‘) #home = auth(auth_type=‘field‘) --> home = auth_func(home) --> home = wrapper
def home(name):
    print("欢迎%s回家" %name)
@auth(auth_type=‘ldap‘)
def shopping():
    time.sleep(2)
    print("购物车里有:牛奶,面包,大米")
home(‘zsz‘)
shopping()

输出结果为:

认证方式是: filedb
用户名:zsz
密码:123
欢迎zsz回家
认证方式是: ldap
购物车里有:牛奶,面包,大米
函数运行时间为2.0004611015319824秒

原文地址:https://www.cnblogs.com/zhangsenzhen/p/9392258.html

时间: 2024-10-07 23:41:38

函数闭包带参数装饰器的相关文章

python带参数和不带参数装饰器

http://blog.csdn.net/pipisorry/article/details/41902599 对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数对象名: 对于有参数的装饰器在调用时使用的是应用的参数,@timeStumpFunc_args(argv)的argv,已不再是要被装饰的函数对象名,所以必须在内部再定义一个函数getfunc()来接收要被装饰的函数对象. #!/usr/bin/env python # coding=gbk """ __title

闭包函数、无参装饰器2

一.闭包函数 闭包函数:函数内部定义函数,成为内部函数.该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数. name='alex' #定义全局变量name='alex' def func(): name='egon' #定义局部变量name='egon' def bar(): print(name) return bar #返回bar函数名 b=func() #执行func()结果为bar的函数名 相当于b=bar name='haha' #重新定义全局变量n

Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 传入函数 函数的本身也可以作为参数. Python内建的mapreduce的函数.(来源于谷歌的,后来被道格这家伙开源了,成为当今处理大数据最火热的hadoop中的计算模型---MapReduce) 我们先看map.map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序

【函数】04、装饰器

一.高阶函数 python中函数是一等对象(first class):函数也是对象,并且它可以像普通对象一样复制.作为参数.作为返回值. 返回函数或者参数是函数的函数就是高阶函数,也被称为函数式编程 In [23]: def counter(base):     ...:     def inc(x=1):     ...:         nonlocal base     ...:         base += x     ...:         return base     ...:

闭包函数、无参装饰器

闭包函数:函数内部定义函数,成为内部函数.该内部函数包含对外部作用域,而不是对全局作用域名字的引用,那么该内部函数成为闭包函数. name='alex' #定义全局变量name='alex' def func(): name='egon' #定义局部变量name='egon' def bar(): print(name) return bar #返回bar函数名 b=func() #执行func()结果为bar的函数名 相当于b=bar name='haha' #重新定义全局变量name='ha

python描述符、property、函数(类)装饰器实例解析

1 import sys 2 3 ''' 4 当使用实例对象访问属性时,都会调用__getattribute__内建函数 5 __getattribute__查找属性的优先级 6 1.类属性 7 2.数据描述符 8 3.实例属性 9 4.非数据描述符 10 5.__getattr__() 11 12 #实例.属性 13 c.x ==>type(x).__dict__['x'].__get__(x,type(x)) 14 #类.属性 15 C.x ==>X.__dict__['x'].__get

python基础之函数进阶之函数作为返回值/装饰器

因为装饰器需要用到返回函数的知识,所以在这里将返回函数和装饰器合并讲解. 什么是返回函数? 我们知道,一个函数中return可以返回一个或者多个值,但其实,return不仅可以返回值,还可以返回函数. 实例: def col(*arg): def sum(): res_sum=0 for i in arg: res_sum=res_sum+i return res_sum return sum a=col(1,2,3,4,5) print(a)<function col.<locals>

关于闭包即双层装饰器的理解

** 闭包**:就是一个概念,出现在嵌套函数中,指的是内层函数引用到了外层函数的**自由变量**(未在本地作用域中定义的局部变量),就形成了闭包. 函数的局部作用域是不能够保存信息的,即在函数内部声明变量在函数调用结束之后函数里面保存的信息就被销毁了,包括函数的参数.而这时使用闭包的话就能发挥作用: **保存函数的状态信息,使函数的局部变量信息依然可以保存下来**.形成闭包之后,闭包变量能够随着闭包函数的调用而实时更新,就好像是一个全局变量那样. 我们发现每次再运行该函数,里面的count变量其

python 装饰器 晋级 系统自带的装饰器

#带参数的装饰器 #500个函数 # import time # FLAGE = False # def timmer_out(flag): # def timmer(func): # def inner(*args,**kwargs): # if flag: # start = time.time() # ret = func(*args,**kwargs) # end = time.time() # print(end-start) # return ret # else: # ret =