Discuss / Python / 练习

练习

Topic source

xian_wen

#1 Created at ... [Delete] [Delete and Lock User]
def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        start = time.time()  # 单位为 s
        res = fn(*args, **kw)
        end = time.time()
        t = (end - start) * 1000
        print('%s executed in %.2f ms' % (fn.__name__, t))
        return res

    return wrapper

xian_wen

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

函数调用的前后打印出'begin call''end call'的日志:

def log(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        print('begin call %s():' % fn.__name__)
        res = fn(*args, **kw)
        print('begin call %s():' % fn.__name__)
        return res

    return wrapper

既支持@log(),又支持@log('execute')

def log(text='call'):
    def decorator(fn):
        @functools.wraps(fn)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, fn.__name__))
            return fn(*args, **kw)

        return wrapper

    return decorator

xian_wen

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

还是大佬们的方法好:

def log(str):
    def decorator(fn):
        @functools.wraps(fn)
        def wrapper(*args, **kw):
            if callable(str):
                print('call %s():' % fn.__name__)
                return fn(*args, **kw)
            else:
                print('%s %s():' % (str, fn.__name__))

        return wrapper

    if callable(str):
        return decorator(str)
    return decorator

heimiguoguo

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

廖老师留的作业是要求支持

@log
@log('execute')

而不是

@log()
@log('execute')

这个是有区别的,我的实现是这样的

def log(param):

    if callable(param):

        def wrapper(*args, **kw):

            print('before call')

            result = param(*args, **kw)

            print('end call')

        return wrapper

    else:

        def decorator(func):

            def wrapper(*args, **kw):

                print('before %s' % param)

                result = func(*args, **kw)

                print('after %s' % param)

                return result

            return wrapper

        return decorator

但是感觉不完美,这个wrapper在两个条件下都用到了,貌似是可以提出来的。

@heimiguoguo

def log(param):

    if callable(param):

这样的定义方法

在调用的时候,怎样同时支持  @log  和 @log(text)  两种形式的调用法?

试了一下

-- 同时给出带参数@log("XXX")和不带参数的 @log语句定义,默认只会调用不带参数的

还是大佬的  log(str)  方法更精简

不过,这个方法调用的时候也不知道怎样指定装饰器是否带参数?

如果同时给出带参数@log("XXX")和不带参数的 @log语句定义,now()默认只会调用不带参数的


  • 1

Reply