python section/decorator

Reference article

Decorator

Decorator

Everyone who has used Java knows that Java's AOP is very convenient. It can do some operations before and after calling methods, such as printing logs. Python also has a similar function, which is the decorator. Let's take the printing log as an example.

Before printing the log

def buy(good_name):
    print("购买商品 %s " % good_name)


def payment(money: int):
    print("支付金额 %d " % money)


if __name__ == "__main__":
    buy("10斤苹果")
    payment(30)

operation result:

购买商品 10斤苹果 
支付金额 30 

Automatically print log before function call

Print log function

import functools

# 在函数调用前自动打印日志
def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print("call  function: %s args: %s kw: %s " % (func.__name__, args, kw))
        return func(*args, **kw)

    return wrapper

Add a comment on the calling function

@log
def buy(good_name):
    print("购买商品 %s " % good_name)


@log
def payment(money: int):
    print("支付金额 %d " % money)


if __name__ == "__main__":
    buy("10斤苹果")
    payment(30)

operation result:

call  function: buy args: ('10斤苹果',) kw: {} 
购买商品 10斤苹果 
call  function: payment args: (30,) kw: {} 
支付金额 30 

Print logs before and after the function call

# 在函数调用前后自动打印日志
def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print("start call  function: %s args: %s kw: %s " % (func.__name__, args, kw))
        result = func(*args, **kw)
        print("end call  function: %s args: %s kw: %s " % (func.__name__, args, kw))
        return result

    return wrapper

operation result:

start call  function: buy args: ('10斤苹果',) kw: {} 
购买商品 10斤苹果 
end call  function: buy args: ('10斤苹果',) kw: {} 
start call  function: payment args: (30,) kw: {} 
支付金额 30 
end call  function: payment args: (30,) kw: {} 

Customize parameters and print logs before and after the function call

def log(description="", version="1.0"):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print("start %s version=%s . call function: %s args: %s kw: %s " % (
                description, version, func.__name__, args, kw))
            result = func(*args, **kw)
            print("end %s version=%s . call function: %s args: %s kw: %s " % (
                description, version, func.__name__, args, kw))
            return result

        return wrapper

    return decorator
@log(description="购买商品", version="2.2")
def buy(good_name):
    print("购买商品 %s " % good_name)


@log(description="支付金额")
def payment(money: int):
    print("支付金额 %d " % money)


if __name__ == "__main__":
    buy("10斤苹果")
    payment(30)

operation result:

start 购买商品 version=2.2 . call function: buy args: ('10斤苹果',) kw: {} 
购买商品 10斤苹果 
end 购买商品 version=2.2 . call function: buy args: ('10斤苹果',) kw: {} 
start 支付金额 version=1.0 . call function: payment args: (30,) kw: {} 
支付金额 30 
end 支付金额 version=1.0 . call function: payment args: (30,) kw: {} 

Guess you like

Origin blog.csdn.net/fangye1/article/details/112219667