Discuss / Python / 思考题

思考题

Topic source

Super-String

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

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

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print('begin call')
        result = func(*args, **kwargs)
        print('end call')
        return result
    return wrapper

2.再思考一下能否写出一个@log的decorator,使它既支持:

@log
def f(): 

又支持:

@log('execute') 
def f(): 
def log(arg=None):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if arg is None:
                print('begin call')
            else:
                print(f'begin {arg}')
            result = func(*args, **kwargs)
            if arg is None:
                print('end call')
            else:
                print(f'end {arg}')
            return result
        return wrapper
    if callable(arg):
        return decorator(arg)
    else:
        return decorator

RtXxXy

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

最后这个貌似有问题,无论@log后加不加参数,arg都不会为None,因为即使没有参数,f也会被赋给arg,这样也会输出'begin {arg}'


  • 1

Reply