Discuss / Python / decorator

decorator

Topic source

90丶无悔

#1 Created at ... [Delete] [Delete and Lock User]

# decorator

import time

import datetime

from pytz import timezone

from functools import wraps

def log(func):

    def wrapper(*args, **kwargs):

        print(f"call {func.__name__}")

        return func(*args, **kwargs)

    return wrapper

def log1(text):

    def decorator(func):

        @wraps(func)

        def wrapper(*args, **kwargs):

            print(f"called function:{func.__name__}")

            return func(*args, **kwargs)

        return wrapper

    return decorator

@log1("execute")

def now():

    tz = timezone('Asia/Shanghai')

    t = datetime.datetime.fromtimestamp(int(time.time()), tz).strftime('%Y-%m-%d %H:%M:%S')

    return t

def metric(fn):

    @wraps(fn)

    def wrapper(*args, **kwargs):

        print('%s executed in %s ms' % (fn.__name__, 10.24))

        return fn(*args, **kwargs)

    return wrapper

@metric

def fast(x, y):

    time.sleep(0.0012)

    return x + y

@metric

def slow(x, y, z):

    time.sleep(0.1234)

    return x * y * z

def log2(fn):

    @wraps(fn)

    def wrapper(*args, **kwargs):

        print("begin call function: %s" % fn.__name__)

        fn(*args, **kwargs)

        print("end call function: %s" % fn.__name__)

        return

    return wrapper

def log3(fn_or_desc):

    if type(fn_or_desc) == str:

        def derocator(fn):

            @wraps(fn)

            def wrapper(*args, **kwargs):

                print("begin call function: %s" % fn.__name__)

                fn(*args, **kwargs)

                print("end call function: %s" % fn.__name__)

            return wrapper

        return derocator

    else:

        @wraps(fn_or_desc)

        def wrapper(*args, **kwargs):

            print("begin call function: %s" % fn_or_desc.__name__)

            fn_or_desc(*args, **kwargs)

            print("end call function: %s" % fn_or_desc.__name__)

            return

        return wrapper

@log2

def test2():

    print("function name: %s" % test2.__name__)

@log3

def test3_1():

    print("function name: %s" % test3_1.__name__)

@log3("execute")

def test3_2():

    print("function name: %s" % test3_2.__name__)

if __name__ == '__main__':

    print(now())

    print(now.__name__)

    f = fast(11, 22)

    s = slow(11, 22, 33)

    if f != 33:

        print('测试失败!')

    elif s != 7986:

        print('测试失败!')

    else:

        print("测试成功")

    test2()

    test3_1()

    test3_2()


  • 1

Reply