Discuss / Python / 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志

请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志

Topic source

VincyChan4231

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

我这么写对不对?

import time, functools

def metric(fn):

    @functools.wraps(fn)

    def wrapper(*args,**kw):

        print('begin call')

        res=fn(*args,**kw)

        print('end call')

        return res

    return wrapper

VincyChan4231

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

既支持 @log 又支持 @log('text') 是这么写吗?

import functools

def log(*args):

    a0=None

    if args==None :

        pass

    else:

        a0=args[0]

    #a1=args[1]

    def decorator(fn):

        @functools.wraps(fn)

        def wrapper(*args2, **kw):

            if a0==None:

                print('函数名:%s\nlog' % (fn.__name__))

            else:

                print('函数名:%s\nlog参数:%s' % (fn.__name__,a0))

            return fn(*args2, **kw)

        return wrapper

    return decorator

@log('这里是带参数的decorator对应的参数') #带参数的decorator

def f2():

    print('f2程序执行成功')

f2()

@log('f33')

def f3():

    print('f3程序执行成功')

f3()

VincyChan4231

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

既支持 @log 又支持 @log('text') ,写的不对>_< 

上面的 @log 不支持 >_<

VincyChan4231

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

既支持 @log 又支持 @log('text') ,这次好像对了 >_<

import functools

def log(*args):

    a0=args

    #print(a0)

    def decorator(fn):

        @functools.wraps(fn)

        def wrapper(*args2, **kw):

            if len(a0)==0:

                print('函数名:%s\nlog' % (fn.__name__))

            else:

                print('函数名:%s\nlog参数:%s' % (fn.__name__,a0))

            return fn(*args2, **kw)

        return wrapper

    return decorator

@log('这里是带参数的decorator对应的参数') #带参数的decorator

def f2():

    print('f2程序执行成功')

f2()

@log()

def f3():

    print('f3程序执行成功')

f3()

过分了啊老铁,f3上面的装饰器也带括号的话那跟f2那个一个意思吧

True_Believer

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

我也觉得带()有点作弊了,直接改成可变参数就可以了呀。


  • 1

Reply