黄哥Python 帮网友debug装饰器代码

有知乎网友提问

用python编写decorator,使其支持@log和@log(text),程序有错,求指导?

该代码是错误的,黄哥修改如下。

'''
   黄哥Python培训 黄哥改写
   Python 3

'''
import functools


def log(t):

    if isinstance(t, str):
        def decorator(fn):
            @functools.wraps(fn)
            def wrapper(*args, **kw):
                print('%s %s()' % (t, fn.__name__))
                return fn(*args, **kw)
            return wrapper
        return decorator
    else:
        @functools.wraps(t)
        def wrapper(*args, **kw):
            print('%s() is executed' % t.__name__)
            return t(*args, **kw)
        return wrapper


@log
def foo(x, y):
    return x + y


@log("hello Python")
def foo2(x, y):
    return x + y


if __name__ == '__main__':
    print(foo(2, 3))
    print(foo2(2, 3))

该代码有冗余代码,完全可以用一个默认参数达到同样的效果。

请看下面的代码

'''
   黄哥Python培训 黄哥改写
   Python 3

'''
import functools


def log(t='hello'):

        def decorator(fn):
            @functools.wraps(fn)
            def wrapper(*args, **kw):
                if t != 'hello':
                    print('%s %s()' % (t, fn.__name__))
                return fn(*args, **kw)
            return wrapper
        return decorator


@log()
def foo(x, y):
    return x + y


@log("hello Python")
def foo2(x, y):
    return x + y


if __name__ == '__main__':
    print(foo(2, 3))
    print(foo2(2, 3))

最有价值的是:讲编程思路的视频、作业训练和答疑服务。

录制好的50讲视频+作业训练+qq答疑 效果等于面授。欢迎参加黄哥python远程视频培训,

帮你完成从不会写代码到会写代码解决问题的过渡。

pythonpeixun/article

咨询qq:1465376564

部分免费python免费视频

pythonpeixun/article

稿源:通过python学会编程 (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 综合编程 » 黄哥Python 帮网友debug装饰器代码

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录