I understand that calling bar('test1) is basically calling foo(bar('test1'))
不,那是不正确的。在
调用bar('test1')相当于bar = foo(bar)
bar('test1')Why do I have to return test for the decorator to work? returning directly Decorator test: '+bar(some_string) doesn't work as some_string is not defined.
当你这么做的时候
^{pr2}$
Python将其转换为
^{3}$
{/strong>你可以看到一个新的函数。这就是为什么必须从foo返回test才能使bar正常工作。否则,None被分配给bar:>>> def foo(bar):
def test(some_string):
return 'Decorator test: '+bar(some_string)
>>> @foo
def bar(some_string):
return some_string[:3]
>>> bar()
Traceback (most recent call last):
File "", line 1, in
bar()
TypeError: 'NoneType' object is not callableHow does test know about some_string while foo doesn't?
只是因为在到达test之前,some_string是不会被创建的。some_string是test的参数,因此它只存在于test的范围内。否则,不存在名称some_string,因此如果您尝试访问它,将得到一个NameError,包括foo的内部。在
如果要print的值some_string,请在test内执行此操作:def foo(bar):
def test(some_string):
print(some_string)
return 'Decorator test: '+bar(some_string)
return test