python-18 装饰器

柯里化

enter description here
enter description here
enter description here
enter description here
enter description here

装饰器

enter description here
enter description here
enter description here

enter description here
enter description here

enter description here
enter description here

enter description here

enter description here

import datetime
import time

def logger(fn):
    def wrapper(*args, **kwargs):
        print('before +++++++++++++++++++')
        start = datetime.datetime.now()
        ret = fn(*args, **kwargs)
        delta = (datetime.datetime.now() - start).total_seconds()
        print('{} took {}s'.format(fn.__name__, delta))
        return ret 
    return wrapper

@logger  # logger 1 个参数 add = logger(add) => add = wrapper
def add(x, y):
    time.sleep(2)
    return x + y

print(add(10, 11))

enter description here
enter description here
enter description here
enter description here
enter description here

文档字符串

enter description here
enter description here

enter description here

def copy_properties(src, dest):
    dest.__name__ = src.__name__
    dest.__doc__ = src.__doc__

def logger(fn):
    def wrapper(*args, **kwargs):
        """wrapper function doc"""
        print('brfore ++++++++')
        ret = fn(*args, **kwargs)
        print('alter +++++++++')
        return ret
#     wrapper.__name__ = fn.__name__
#     wrapper.__doc__ = fn.__doc__
    copy_properties(fn, wrapper)
    
    return wrapper

#@logger
def add(x, y):
    """add function doc"""
    return x + y 

print(add(10, 11))
print(add.__name__, add.__doc__)

enter description here

enter description here

def copy_properties(src):
    def _copy(dest):
        dest.__name__ = src.__name__
        dest.__doc__ = src.__doc__
        return dest
    return _copy
    
def logger(fn):
    @copy_properties(fn)
    def wrapper(*args, **kwargs):
        """wrapper function doc"""
        print('brfore ++++++++')
        ret = fn(*args, **kwargs)
        print('alter +++++++++')
        return ret
#     wrapper.__name__ = fn.__name__
#     wrapper.__doc__ = fn.__doc__
    #copy_properties(fn)(wrapper)
    
    return wrapper

@logger
def add(x, y):
    """add function doc"""
    return x + y 

print(add(10, 11))
print(add.__name__, add.__doc__)

enter description here

enter description here

enter description here
enter description here
enter description here

enter description here
enter description here

enter description here

又做一层柯里化
enter description here

enter description here

enter description here

from functools import update_wrapper, wraps
import time

def savedb(name, delta):
    print('存入数据库')
    pass 

def logger(duration=5, x=lambda name, delta:print("{} took {}s. slowly".format(name, delta))):
    def inner(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            start = datetime.datetime.now()
            ret = fn(*args, **kwargs)
            delta = (datetime.datetime.now() - start).total_seconds()
            if delta > duration:
                x(fn.__name__, delta)
                
            return ret
        return wrapper
    return inner

@logger(x=savedb)
def add(x, y):
    time.sleep(6)
    return x + y
        

functools模块

enter description here

enter description here
enter description here
enter description here

enter description here
enter description here

类型注解

友好提示,不影响执行
enter description here

enter description here
enter description here

enter description here
enter description here

enter description here
enter description here
enter description here
enter description here
enter description here

posted @ 2022-04-22 09:59  何时&明月  阅读(23)  评论(0)    收藏  举报