首页 > 其他分享 >装饰器functools wraps, update_wrapper, partial 以及 装饰器传参

装饰器functools wraps, update_wrapper, partial 以及 装饰器传参

时间:2023-04-20 10:35:08浏览次数:40  
标签:__ wraps partial 函数 update wrapper 装饰 def

partial、update_wrapper、wraps的使用

引用

from functools import wraps, update_wrapper, partial

1. partial

partial又叫偏函数。函数在执行的时候需要带上必要的参数,有些参数是执行之前就是可知的,这种情况下,一个函数有一个或者多个函数预先就能用上,以便函数能够更少的参数进行调用。

# 定义一个函数
def add(x, y): 
    return x + y

add1 = partial(add, y=3) # 这里创建了一个新的函数

print add1(4) # 7
print add(x=4, y=9) # 13

2. update_wrapper

update_wrapper这个函数的主要功能是负责copy原函数的一些属性,如moudle、name、doc、等,如果不加update_wrapper,那么被装饰器修饰的函数就会丢失其上面的一些属性信息

# 定义装饰器
def wrapper(f):
    def wrapper_function(*args, **kwargs):
        return f(*args, **kwargs)
    update_wrapper(wrapper_function, f)
    return wrapper_function

@wrapper
def wrapped():
    pass

print(wrapped.__doc__) # 输出`这个是被修饰的函数`
print(wrapped.__name__) # 输出`wrapped`
# __doc__和__name__属性已经是wrapped函数中的,当然,update_wrapper函数也对__module__和__dict__等属性进行了更改和更新

3. wraps

被装饰器修饰后的函数会编程另外一个函数,为了不受影响,利用wraps来消除这样的副作用,使它能够保持原函数的属性。

# 定义装饰器
def wrapper(f):
    @wraps(f)
    def wrapper_function(*args, **kwargs):
        return f(*args, **kwargs)
    return wrapper_function

@wrapper 
def wrapped(): 
    pass

带参数的装饰器

来想想这个问题,难道@wraps不也是个装饰器吗?但是,它接收一个参数,就像任何普通的函数能做的那样。
那么,为什么我们不也那样做呢? 这是因为,当你使用@my_decorator语法时,你是在应用一个以单个函数作为参数的一个包裹函数。
记住,Python里每个东西都是一个对象,而且这包括函数!记住了这些,我们可以编写一下能返回一个包裹函数的函数。

在函数中嵌入装饰器
创建一个包裹函数,能让我们指定一个用于输出的日志文件。

from functools import wraps 


def logit(logfile='out.log'): 
    def logging_decorator(func): 
        @wraps(func) 
        def wrapped_function(*args, **kwargs): 
            log_string = func.__name__ + " was called" 
            print(log_string) 
            # 打开logfile,并写入内容 
            with open(logfile, 'a') as opened_file: 
                # 现在将日志打到指定的logfile 
                opened_file.write(log_string + '\n') 
            return func(*args, **kwargs) 
        return wrapped_function 
    return logging_decorator 

@logit() 
def myfunc1(): 
    pass 

myfunc1() 
# Output: myfunc1 was called 
# 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串 

@logit(logfile='func2.log') 
def myfunc2(): 
    pass 

myfunc2() 
# Output: myfunc2 was called 
# 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串

标签:__,wraps,partial,函数,update,wrapper,装饰,def
From: https://www.cnblogs.com/clearheart/p/17335853.html

相关文章

  • Day08-设计模式之装饰者模式
    设计模式之装饰者模式引例需求:假设现在有烧饵块:白米饵块(WhiteRice),紫米饵块(PurpleRice),黄米饵块(yellowRice),调料有热狗(HotDog),油条(oilNoodle),鸡柳(chicken),客户可以单点白米的,或者白米+调料的组合,计算相应的费用,要求在扩展饵块种类的时候,具有良好的扩展性,改动维护方便。一般解法方......
  • 谈一谈Python中的装饰器
    1、装饰器基础介绍1.1何为Python中的装饰器?Python中装饰器的定义以及用途:装饰器是一种特殊的函数,它可以接受一个函数作为参数,并返回一个新的函数。装饰器可以用来修改或增强函数的行为,而不需要修改函数本身的代码。在Python中,装饰器通常用于实现AOP(面向切面编程),例如日志记录......
  • 谈一谈Python中的装饰器
    1、装饰器基础介绍1.1何为Python中的装饰器?Python中装饰器的定义以及用途:装饰器是一种特殊的函数,它可以接受一个函数作为参数,并返回一个新的函数。装饰器可以用来修改或增强函数的行为,而不需要修改函数本身的代码。在Python中,装饰器通常用于实现AOP(面向切面编程),例如日志记录......
  • Python之带参装饰器(12)
    一、文档字符串无参装饰器和带参装饰器有什么区别呢?我们先来看文档字符串文档字符串是什么东西呢?文档字符串. ●Python文档字符串DocumentationStrings ●在函数(类、模块)语句块的第一行,且习惯是多行的文本,所以多使用三引号 ●文档字符串也算是合法的一条语句 ●惯例是首字母......
  • 装饰器
    #导入logging包importloggingdefdecorator(func):defwrapper(*args,**kwargs):try:func(*args,**kwargs)logging.info(*args,**kwargs)except:logging.error(*args,**kwargs)returnwrapper@dec......
  • 03装饰者模式
    例子星巴兹是以扩张速度最快而闻名的咖啡连锁店。因为扩张速度实在太快,他们着急更新订单系统,来匹配他们的饮料供应要求。实现1---继承购买咖啡时,也可以要求其中加入各种调料,例如:蒸奶,豆浆很明显,星巴兹为自己制造了一个维护噩梦,如果牛奶的价钱上扬,怎么办?新增一种焦糖调料风味......
  • python版 异常重试的次数,间隔的装饰器涵数
    fromfunctoolsimportwrapsfromthreadingimportEventdefretry_exception(retry_count=0,interval_wait=0):defwrap(f):@wraps(f)deffunc(*args,**kwargs):try:returnf(*args,**kwargs)exc......
  • Django在类中使用装饰器
    类的视图函数中使用装饰器场景描述前后端分离项目后端暴露接口前端调用一个接口根据不同的请求方式处理不同的内容比如我有一个/user接口:get:返回成员信息post:添加信息put:修改信息delete:删除信息在每个请求中都需要判断凭证,也就是请求头中的某个字段,来鉴别用户身份,如果......
  • django 1.8 官方文档翻译: 3-1-4 视图装饰器
    视图装饰器Django为视图提供了数个装饰器,用以支持相关的HTTP服务。允许的HTTP方法django.views.decorators.http包里的装饰器可以基于请求的方法来限制对视图的访问。若条件不满足会返回django.http.HttpResponseNotAllowed。require_http_methods(request_method_list)[source]......
  • sqlalchemy快速插入数据,scoped_session线程安全,加载类上的装饰器,基本增删改查,django中
    今日内容sqlalchemy快速插入数据sqlalchemy是什么orm框架,跟其他web框架没有必然联系,可以独立使用安装,快速使用,执行原生sql创建表和删除表不能创建数据库不能修改字段(增加,删除)使用orm插入第一步:生成engine对象engine=create_engine("mysql+pymysql://root@127.0.0.......