装饰器错误示例

时间:2016-07-23 13:05:20

标签: python python-decorators

我试图理解Python装饰器并编写了这段代码:

def hello_world(fn):
    print('hello world')
    fn()
    pass

@hello_world
def decorate():
    print('hello decoatrion')
    return

decorate()

我的目标是打印“你好世界”。之前'你好装饰',但输出如下:

hello world
hello decoatrion
Traceback (most recent call last):
  File "test_decortor.py", line 11, in <module>
    decorate()
TypeError: 'NoneType' object is not callable

2 个答案:

答案 0 :(得分:3)

装饰者必须返回修饰函数。你可能想要这些内容:

def hello_world(fn):
    def inner():
        print('hello world')
        fn()
    return inner

@hello_world
def decorate():
    print('hello decoatrion')
    return

decorate()
#output: hello world
#        hello decoatrion

答案 1 :(得分:3)

装饰器语法是

的简写
decorated = decorate(decorated)

所以如果你有:

def hello_world(fn):
    print('hello world')
    fn()
    pass

def decorate():
    print('hello decoatrion')
    return

decorate = hello_world(decorate)

你应该看看问题是什么(还要注意pass在这里什么都不做。)

def hello_world(fn):
    def says_hello():
        print('hello world')
        return fn()
    return says_hello

def decorate():
    print('hello decoration')

decorate = hello_world(decorate)

会做你想要的。或者你可以写下来:

@hello_world
def decorate():
    print('hello decoration')